2014-03-26 63 views
0

我在Sql Server 2008 R2中有一個包含產品訂單的表。在大多數情況下,它是每個產品SQL Server Recusive Query

ID | Prod | Qty 
------------ 
1 | A | 1 
4 | B | 1 
7 | A | 1 
8 | A | 1 
9 | A | 1 
12 | C | 1 
15 | A | 1 
16 | A | 1 
21 | B | 1 

我想在此基礎上看起來是這樣的

ID | Prod | Qty 
------------------ 
1 | A | 1 
4 | B | 1 
9 | A | 3 
12 | C | 1 
16 | A | 2 
21 | B | 1 

我已經寫了使用表表達式的查詢表中創建一個視圖中的一個條目,但我很難理解如何使它工作。下面的SQL實際上不起作用,但是我正在嘗試做的一個示例。我用多種不同的方式編寫了這個查詢,但無法弄清楚如何獲得正確的結果。我正在使用row_number生成順序標識。從那以後,我可以對連續行進行排序和比較,以查看下一行是否具有與上一行相同的產品,因爲ReleaseId是順序的,但不一定是連續的。任何幫助表示讚賞。

;with myData AS 
(
    SELECT 
    row_number() over (order by a.ReleaseId) as 'Item', 
    a.ReleaseId, 
    a.ProductId, 
    a.Qty 
    FROM OrdersReleased a 

    UNION ALL 

    SELECT 
    row_number() over (order by b.ReleaseId) as 'Item', 
    b.ReleaseId, 
    b.ProductId, 
    b.Qty 
    FROM OrdersReleased b 
    INNER JOIN myData c ON b.Item = c.Item + 1 and b.ProductId = c.ProductId       
) 
SELECT * from myData 
+0

作爲替代方案,我試圖書面方式像這樣;具有myData的AS ( SELECT ROW_NUMBER()以上(由ord.ReleaseId順序)爲 '項目', ord.ReleaseId, \t ORD .ProductId, ord.Qty FROM \t \t ORD OrdersReleased ) SELECT MAX(c.ReleaseId)作爲 '釋放', \t c.ProductId, 總和(C .Qty)爲 '數量' FROM \t \t ÇmyData的LEFT JOIN myData的d ON d.Item = c.Item + 1和d.productid = c.productid 組由c.item,c.releaseid,C。 productid,c.qty order by c.ReleaseId –

回答

0

通常情況下,您將ID從這樣的內容中刪除,因爲它是摘要。

SELECT a.ProductId, 
    SUM(a.Qty) AS Qty 
    FROM OrdersReleased a 
    GROUP BY a.ProductId 
    ORDER BY a.ProductId 

- 如果您想進行子查詢,您可以將它作爲列(如果您沒有非常大的數據集)。

SELECT a.ProductId, 
     SUM(a.Qty) AS Qty, 
     (SELECT COUNT(1) 
      FROM OrdersReleased b 
      WHERE b.ReleasedID - 1 = a.ReleasedID 
      AND b.ProductId = b.ProductId) as NumberBackToBack 
    FROM OrdersReleased a 
    GROUP BY a.ProductId 
    ORDER BY a.ProductId 
+0

我不確定我關注。 Row_number()加上ProductId建立記錄之間的關係。我同意它可以從最終的SELECT中刪除,但不知道如何在沒有它的情況下使查詢工作。 –

+0

嘗試更改我的SQL以適合您的名字。第三列是否不需要row_number()? – JBrooks

+0

除了ReleaseId不一定是連續的,所以b.Id - 1 = a.ID並不總是成立,這就是爲什麼我必須添加row_number()。 –