将SQL Server 2012 CTE转换为SQL Server 2008

将SQL Server 2012 CTE转换为SQL Server 2008,sql,sql-server-2008,sql-server-2012,common-table-expression,Sql,Sql Server 2008,Sql Server 2012,Common Table Expression,我有下面的查询,它在2012年运行良好,因为它使用的是2012年的功能。谁能在2008年以相同的输出实现完全相同的查询?我正在寻找从填充表到桶表的桶填充数据。在SQL 2008中执行时出错。未启用并行数据仓库PDW功能 要在SQL Server 2008中执行相同的查询,必须分两步计算运行总数,第一步是使用按ID排序的行数对行进行排序,然后使用行数计算运行总数: ;WITH fillerCte as ( SELECT ID, Filler, ROW_NUMBER() OV

我有下面的查询,它在2012年运行良好,因为它使用的是2012年的功能。谁能在2008年以相同的输出实现完全相同的查询?我正在寻找从填充表到桶表的桶填充数据。在SQL 2008中执行时出错。未启用并行数据仓库PDW功能


要在SQL Server 2008中执行相同的查询,必须分两步计算运行总数,第一步是使用按ID排序的行数对行进行排序,然后使用行数计算运行总数:

;WITH fillerCte as
(
  SELECT 
   ID,
   Filler,
   ROW_NUMBER() OVER(ORDER BY Id) AS RN
   FROM @Filler
), FillerRT
AS
(
  SELECT 
    f1.ID,
    f1.Filler,
    SUM(f2.Filler) AS TotalFill
  FROM fillerCte AS f1
  INNER JOIN fillerCte AS f2 ON f2.rn <= f1.rn
  GROUP BY f1.ID, f1.Filler
), BucketCte as
(
  SELECT
    ID,
    FullCapacity,
    ROW_NUMBER() OVER(ORDER BY ID) AS RN
  FROM @Buckets
),BucketRN
AS
(
  SELECT 
    b1.ID,
    b1.FullCapacity,
    SUM(b2.FullCapacity) - b1.FullCapacity AS RunningTotalCapacity
  FROM BucketCte AS b1 INNER JOIN BucketCte AS b2 ON b2.RN <= b1.RN
  GROUP BY b1.ID, b1.FullCapacity
)
select 
b.ID, 
b.FullCapacity,
case 
when f.TotalFill < b.RunningTotalCapacity then 0
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
else f.TotalFill - b.RunningTotalCapacity
end as CurrentAmount
from FillerRT as f
cross join BucketRN as b
order by f.ID, b.ID;

这将为您提供与查询相同的精确输出。

在SQL 2008中执行查询时,我在下面遇到错误。并行数据仓库PDW功能未启用。我看到的唯一一件在2008版本中不受支持的事情是运行总数。在这里,您可以找到大量示例,说明如何在不使用窗口函数的情况下在SQL Server中实现运行总计。请将您的问题添加到信息中-这比发布注释更清楚。这是一个已知的解析器错误,不是吗?你不需要凭身份证取消订单吗?谢谢。它起作用了。只是更正一下。将订单上的sumFiller替换为ID为TotalFill作为Filler asTotalFill@user2123852-抱歉,我忘记删除它,请重试我的编辑,它将正常工作。
ID | FullCapacity | CurrentAmount       
---+--------------+--------------
B1 |    100       |    90        
B2 |     50       |     0    
B3 |     70       |     0
---+--------------+--------------
B1 |    100       |   100        
B2 |     50       |    50
B3 |     70       |    10
---+--------------+--------------
B1 |    100       |   100      
B2 |     50       |    50    
B3 |     70       |    50
---+--------------+--------------
B1 |    100       |   100        
B2 |     50       |    50    
B3 |     70       |    70
;WITH fillerCte as
(
  SELECT 
   ID,
   Filler,
   ROW_NUMBER() OVER(ORDER BY Id) AS RN
   FROM @Filler
), FillerRT
AS
(
  SELECT 
    f1.ID,
    f1.Filler,
    SUM(f2.Filler) AS TotalFill
  FROM fillerCte AS f1
  INNER JOIN fillerCte AS f2 ON f2.rn <= f1.rn
  GROUP BY f1.ID, f1.Filler
), BucketCte as
(
  SELECT
    ID,
    FullCapacity,
    ROW_NUMBER() OVER(ORDER BY ID) AS RN
  FROM @Buckets
),BucketRN
AS
(
  SELECT 
    b1.ID,
    b1.FullCapacity,
    SUM(b2.FullCapacity) - b1.FullCapacity AS RunningTotalCapacity
  FROM BucketCte AS b1 INNER JOIN BucketCte AS b2 ON b2.RN <= b1.RN
  GROUP BY b1.ID, b1.FullCapacity
)
select 
b.ID, 
b.FullCapacity,
case 
when f.TotalFill < b.RunningTotalCapacity then 0
when f.TotalFill > b.RunningTotalCapacity + b.FullCapacity then b.FullCapacity
else f.TotalFill - b.RunningTotalCapacity
end as CurrentAmount
from FillerRT as f
cross join BucketRN as b
order by f.ID, b.ID;