2016-01-21 86 views
1

我想合併重複的行(具有相同的doctype,docnum和item),並將它們的'qtd'列的值合計到第一個或第最後一個。然後刪除重複的行,只保留總價值的那一行。 (行號不重要後,刪除它可以不允許序列號)重複的行到第一個(或最後一個)的SQL總和值

其實我只有查詢來檢測重複的行,我需要查詢合併值,並刪除重複的行,留在合併。

PS:這是一個很大的表,所以doctype,docnum和item不能在查詢中表達出來,像這樣... doctype ='stket'和docum ='1'和item ='4506'它們必須是發現 「自動地」

表:文檔(初始與重複的行)

 doctype docnum line item  qtd 
     STKET  1  1 **4506** 10.00 
     STKET  1  2  3860  27.00 
     STKET  1  3 **4506** 4.00 
     STKET  2  1  3860  7.00 
     STKET  3  1 **4048** 2.00 
     STKET  3  2 **4048** 5.00 
     STKET  3  3  4876  11.00 
     STKET  4  1  3860  1.00 

表:文檔(總和後預期結果)

 doctype docnum line item  qtd 
     STKET  1  1  4506 **14.00** 
     STKET  1  2  3860  27.00 
     STKET  1  3  4506  4.00 
     STKET  2  1  3860  7.00 
     STKET  3  1  4048 **7.00** 
     STKET  3  2  4048  5.00 
     STKET  3  3  4876  11.00 
     STKET  4  1  3860  1.00 

表:文檔(刪除DUPLI後預期的結果!cated - 在這種情況不是第一次)

 doctype docnum line item  qtd 
     STKET  1  1  4506 **14.00** 
     STKET  1  2  3860  27.00 
     STKET  2  1  3860  7.00 
     STKET  3  1  4048 **7.00** 
     STKET  3  3  4876  11.00 
     STKET  4  1  3860  1.00 

[後來編輯] - 從 「答案」

的ZLK查詢後我把表文檔是這樣的:

doctype docnum line item  qtd 
    STKET  1  1  4506 **10.00** 
    STKET  1  2  3860  27.00 
    STKET  2  1  3860  7.00 
    STKET  3  1  4048 **2.00** 
    STKET  3  3  4876  11.00 
    STKET  4  1  3860  1.00 

它發現重複和刪除,但沒有總結刪除行的'qtd'值

+0

爲什麼線會變爲0和/或線如何確定? – ZLK

+0

對不起,這是複製\粘貼錯誤,我會編輯帖子,謝謝!該行是auto(連續的),但在刪除某行並且數字不保持連續的情況下工作正常。 –

回答

1

所以我假設你想要的只是一個基本的更新語句,然後刪除狀態換貨。

UPDATE docs SET qtd = updateqtd 
FROM docs d 
JOIN (SELECT doctype, docnum, item, MIN(line) line, SUM(qtd) updateqtd 
FROM docs 
GROUP BY doctype, docnum, item) a ON a.doctype = d.doctype AND a.docnum = d.docnum AND a.item = d.item AND a.line = d.line; 

WITH CTE AS (
    SELECT *, ROW_NUMBER() OVER (PARTITION BY doctype, docnum, item ORDER BY line) RN 
    FROM docs) 
DELETE CTE WHERE RN <> 1 

這會更新最低的行號,然後刪除不是最低行號的行。

+0

我會在今天測試它。謝謝 –

+0

嗨,朋友,對於遲到的回覆,我正在測試您的查詢,它的工作原理檢測重複的行並只保留一行(刪除所有其他行),但它不會在刪除之前對'qtd'求和 –

+0

我測試過再次您的查詢,它的作品很棒!謝謝@ZLK –

相關問題