2011-11-20 52 views
0

我想寫一個存儲過程。T-Sql查找重複的行值

在那個存儲過程中,我想從表中找到重複的行值,並計算這些行上的和操作到同一個表。

比方說,我有一個CustomerSales表;

ID SalesRepresentative Customer Quantity 
1 Michael    CustA  55  
2 Michael    CustA  10 

,我需要把表...

ID SalesRepresentative Customer Quantity 
1 Michael    CustA  65  
2 Michael    CustA  0 

當我發現在同一時間SalesRepresentativeCustomer重複,我想總結這些行的所有Quantity值,並分配給一張桌子的第一排,其他人將是'0'。

你能幫助我嗎?

+0

如果您發佈的代碼,XML或數據樣本,**請**突出顯示文本編輯器的線,然後單擊「代碼示例」按鈕('{ }')在編輯器工具欄上進行恰當的格式化和語法突出顯示! –

+1

另外:它是一個商店* D *過程 - 如在SQL Server中的** STORED ** - 它與一個*商店*無關...... –

回答

2

聚集重複到一行

SELECT min(ID) AS ID, SalesRepresentative, Customer 
     ,sum(Quantity) AS Quantity 
FROM CustomerSales 
GROUP BY SalesRepresentative, Customer 
ORDER BY min(ID) 

或者,如果你真的想與0那些額外行作爲結果Quantity

SELECT ID, SalesRepresentative, Customer 
     ,CASE 
      WHEN (count(*) OVER (PARTITION BY SalesRepresentative,Customer)) = 1 
      THEN Quantity 
      WHEN (row_number() OVER (PARTITION BY SalesRepresentative,Customer 
            ORDER BY ID)) = 1 
      THEN sum(Quantity) OVER (PARTITION BY SalesRepresentative,Customer) 
      ELSE 0 
     END AS Quantity 
FROM CustomerSales 
ORDER BY ID 

這使得大量使用的window functions

替代版本,而窗函數:

SELECT min(ID) AS ID, SalesRepresentative, Customer, sum(Quantity) AS Quantity 
FROM CustomerSales 
GROUP BY SalesRepresentative, Customer 

UNION ALL 
SELECT ID, SalesRepresentative, Customer, 0 AS Quantity 
FROM CustomerSales c 
GROUP BY SalesRepresentative, Customer 
LEFT JOIN (
    SELECT min(ID) AS ID 
    FROM CustomerSales 
    GROUP BY SalesRepresentative, Customer 
    ) x ON (x.ID = c.ID) 
WHERE x.ID IS NULL 
ORDER BY ID 
+0

是的,類似這樣的東西。
SELECT [SalesRep],[Customer] ,sum(Quantity)OVER(PARTITION BY [SalesRep],[Customer]) FROM CustomerSales
它可以工作,除了一件事情。它總計相同的行值,但不會在其他行中設置爲'0'。 ORDER BY ID,[SalesRep],[Customer] – Bertan

+0

@BertanULUSOY:請考慮我的答案的更新版本。 –

+0

是的,它絕對有效。第二個答案很棒...非常感謝Erwin。 OVER(PARTITION ...不是遊標,不是嗎?) – Bertan