SQL 递归查询 - 对排名较低的行求和
SQL Recursive Query - Sum Rows with Lesser Rank
使用 MS SQL - 2012 年 我正在尝试 运行 一个 SQL 查询,该查询按产品 ID 对行进行排名。然后计算代表排名小于或等于它的行的总和。 我设置了一个公式来执行此操作并且它有效但速度慢且资源昂贵。
我的直觉是有一个 CTE 或 Rank 函数可以满足我的要求 - 我只是不知道。
如果一个产品有 4 行,我可以使用排名重新计算较小行数量的总和。
Product Order Qty Rank Sum
Apple John 5 1 5
Apple Josh 2 2 7
Apple Jacob 1 3 8
Apple Jennifer 1 4 9
第 1 行总和等于(第 1 行数量)
第 2 行总和等于(第 1 行数量,第 2 行数量)
第 3 行总和等于(第 1 行数量,第 2 行数量,第 3 行数量)
第 4 行总和等于(第 1 行数量,第 2 行数量,第 3 行数量,第 4 行数量)
如有任何帮助,我们将不胜感激。
提前致谢。 乔什
对于Sql Server 2012
+:
select *, sum(qty) over(partition by product order by rank) as [sum]
from products
Sql Server 2008
-:
select *, (select sum(qty) from products p2
where p1.product = p2.product and p2.rank <= p1.rank) as [sum]
from products p1
如果我理解正确的话,我认为你想要这个。还提供了示例代码,如果第一个假设有误请评论。
create table #apples
(product varchar(20)
,orders varchar(20)
,qty int
)
insert into #apples
values ('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','john',1)
,('apple','josh',1)
,('apple','josh',1)
,('apple','jacob',1)
,('apple','jennifer',1)
Go
With Tots as
(Select product,orders,sum(qty) 'Sums', RANK() OVER (partition by product ORDER BY SUM(QTY) desc,orders) 'rnk'
from #apples
group by product,orders)
select t1.rnk, SUM(t2.Sums)
from tots t1
inner join Tots t2
on t1.rnk >= t2.rnk
group by t1.rnk