【问题标题】:SQL sum values of duplicate rows into the first one (or last one)SQL 将重复行的值加到第一个(或最后一个)中
【发布时间】:2016-04-27 02:19:39
【问题描述】:

我想合并重复的行(具有相同的 doctype、docnum 和 item)并将它们的 'qtd' 列的值与第一个或最后一个相加。然后删除重复的行,只保留包含总值的行。 (行号删除后不重要,可以不连续号)

实际上我只有查询来检测重复行,我需要查询来合并值并删除合并后剩余的重复行。

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

表格:文档(删除重复后的预期结果 - 在这种情况下不是第一个!)

      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和/或线是如何确定的?
  • 对不起,这是复制\粘贴错误,我会编辑帖子,谢谢!该行是自动的(连续的),但在删除某些行并且数字不会保持连续的情况下它可以正常工作。

标签: sql sql-server merge sum duplicates


【解决方案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

这会更新最低行号,然后删除不是最低行号的任何行。

【讨论】:

  • 我今天会测试它。谢谢
  • 您好朋友,很抱歉回复晚了,我正在测试您的查询,它可以检测重复行并只保留一行(删除所有其他行),但它没有总结“qtd”删除前
  • 我再次测试了您的查询,效果很好!谢谢@ZLK
猜你喜欢
  • 2022-01-09
  • 2019-07-12
  • 2019-03-09
  • 2017-11-03
  • 1970-01-01
  • 1970-01-01
  • 2021-10-05
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多