将SQL Server 2012 CTE转换为SQL Server 2008

用户名

我有以下查询,由于使用了2012年的功能,因此在2012年可以正常使用。任何人都可以在2008年使用完全相同的输出来执行完全相同的查询吗?我正在寻找从Filler表到Bucket表的Bucket填充数据。在SQL 2008中执行它时出现错误。The Parallel Data Warehouse (PDW) features are not enabled

declare @Buckets table (ID char(2), FullCapacity int)
declare @Filler table (ID char(2), Filler int)

insert into @Buckets values
('B1', 100),
('B2', 50),
('B3', 70)

insert into @Filler values
('F1', 90),
('F2', 70),
('F3', 40),
('F4', 20)

;with fillerCte as
(
select 
ID,
Filler,
sum(Filler) over (order by ID) as TotalFill
from @Filler
), 
BucketCte as
(
select 
ID,
FullCapacity,
sum(FullCapacity) over (order by ID) - FullCapacity as RunningTotalCapacity
from @Buckets
)
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 fillerCte as f
cross join BucketCte as b
order by f.ID, b.ID

输出表应在下面显示填充过程。

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
马哈茂德·加马尔(Mahmoud Gamal)

要在SQL Server 2008中执行相同的查询,您必须分两步计算运行总计,第一步是使用来对行进行排名ROW_NUMBER() OVER(ORDER BY 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;

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

将Excel导入SQL Server 2008

来自分类Dev

将varchar值转换为SQL Server 2008中的数据类型int时,转换失败

来自分类Dev

SQL Server 2008和2012之间的T-SQL更改

来自分类Dev

将SQL单元格值转换为SQL Server 2012中的列名称

来自分类Dev

将数据库从SQL Server 2012降级到2008

来自分类Dev

SELECT查询中的默认行顺序-SQL Server 2008与SQL 2012

来自分类Dev

将列数据转换为行,SQL Server 2008

来自分类Dev

卸载SQL Server 2012

来自分类Dev

将Access TRANSFORM / PIVOT查询转换为SQL Server 2012

来自分类Dev

将数据库从SQL Server 2008 Express移至SQL Server 2012

来自分类Dev

SQL Server 2008将多个单词替换为单个单词

来自分类Dev

将列转换为SQL Server 2012中的行

来自分类Dev

在SQL中选择行对(应在SQL Server 2008和2012中工作)

来自分类Dev

PDO DBLIB访问SQL Server 2008和2012

来自分类Dev

将数据库从SQL Server 2012移动到2008

来自分类Dev

Windows相同实例上的SQL Server 2008和2012

来自分类Dev

SQL Server 2008:将行转换为列

来自分类Dev

将SQL单元格值转换为SQL Server 2012中的列名称

来自分类Dev

卸载SQL Server 2012

来自分类Dev

将SQL Server 2008查询转换为bcp查询

来自分类Dev

将SQL Server中的递归CTE转换为netezza

来自分类Dev

将数据库从SQL Server 2008 Express移至SQL Server 2012

来自分类Dev

SQL Server 2012数据转换

来自分类Dev

SQL SERVER 2008 QUERY将行转换为多列

来自分类Dev

SQL Server 2008选择

来自分类Dev

SQL Server 2012查询

来自分类Dev

将 .sql 文件导入 SQL Server 2012

来自分类Dev

如何将 SQL 查询从 SQL Server 2008 升级到 2012

来自分类Dev

将 Nvarchar 转换为 Int 失败的 SQL Server 2008