2016-01-21 85 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 –

相关问题