使用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行数量)
对此的任何帮助将不胜感激。
提前致谢。 约什
答案 0 :(得分:1)
A
+:
Sql Server 2012
select *, sum(qty) over(partition by product order by rank) as [sum]
from products
- :
Sql Server 2008
答案 1 :(得分:0)
如果我正确理解这一点,我想你想要这个。此外,这提供了示例代码,如果第一个假设是错误的,请发表评论。
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