SQL递归查询 - 具有较小排名的总和行

时间:2015-06-15 19:33:51

标签: sql-server 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行数量)

对此的任何帮助将不胜感激。

提前致谢。 约什

2 个答案:

答案 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