2015-06-15 76 views
1

使用MS SQL - 2012 我試圖運行一個按產品ID排列行的SQL查詢。然後計算一個代表小於或等於它的行的總和。 我建立了一個公式來做到這一點,它的工作原理,但速度慢,資源昂貴。SQL遞歸查詢 - 與較低級別求和的行

我的直覺是有一個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

您的問題很難閱讀。請你可以更好地格式化它。謝謝。 –

+0

什麼版本的SQL Server?並向我們​​展示您已擁有的查詢。 – RBarryYoung

回答

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 
+0

謝謝 - 我知道有一個共同的表格表達,將工作。只是無法撥入。 – user2884535

1

對於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 
+0

而不是子查詢,直接加入p2會更高效。因此:'從產品p1中選擇p1.products,p1.order,p1.qty,p1.rank,sum(p2.qty)加入p1.product = p2.product和p2.rank <= p1.rank組中的產品p2由p1.products,p1.order,p1.qty,p1.rank' –