【问题标题】:Avoid duplicate row to SUM twice避免重复行到 SUM 两次
【发布时间】:2018-05-06 16:07:57
【问题描述】:

我有一个包含重复行的表,我如何将该重复行求和为不同的值?我知道我可以将不同的数据插入新表并以这种方式求和,但我试图避免创建任何类型的表。 表:

SELECT '123' DateID,'8' HOUR,'6000' AMT, '20150801' PayEndingDate, '20150807' CheckDate
INTO #DATA
UNION ALL
SELECT '456',8,'6000','20150801','20150807' UNION ALL
SELECT '789',8,'6000','20150801','20150807' UNION ALL --DUP ROW
SELECT '789',8,'6000','20150801','20150807' UNION ALL --DUP ROW
SELECT '987',8,'6000','20150725','20150807' UNION ALL
SELECT '654',8,'6000','20150725','20150807' UNION ALL
SELECT '321',8,'6000','20150725','20150807' UNION ALL --DUP ROW
SELECT '321',8,'6000','20150725','20150807' --DUP ROW
SELECT * FROM #DATA

|DateID | HOUR  | AMT      | PayEndingDate  | CheckDate
 123      8       6000       20150801         20150807
 456      8       6000       20150801         20150807
 789      8       6000       20150801         20150807
 789      8       6000       20150801         20150807
 987      8       6000       20150725         20150807
 654      8       6000       20150725         20150807
 321      8       6000       20150725         20150807
 321      8       6000       20150725         20150807

SELECT  DISTINCT SUM(HOUR) AS HOURS, AMT, PayEndingDate, CHECKDATE
FROM #DATA
GROUP BY AMT,PayEndingDate,CHECKDATE

| HOUR  | AMT      | PayEndingDate  | CheckDate
  32      6000       20150725         20150807
  32      6000       20150801         20150807

如您所见,ID 321789 重复,导致小时数为 32 而应为 24。在 SUM 中添加 distinct 仅返回 8。在这种情况下如何避免重复?

【问题讨论】:

  • 你为什么不对AMT求和?
  • 不需要SELECT DISTINCT,因为GROUP BY 不会返回重复的行。

标签: sql sql-server sum duplicates


【解决方案1】:

试试这个...

Select SUM(HOUR) AS HOURS, AMT, PayEndingDate, CHECKDATE
From (
SELECT  DISTINCT DateID, HOUR , AMT, PayEndingDate, CHECKDATE
FROM #DATA
) A
GROUP BY AMT,PayEndingDate,CHECKDATE

【讨论】:

  • 谢谢,我也想避免内部查询。我猜除了这个或临时表或CTE之外没有其他方法。它必须从其他东西(内部查询、cte、临时表)中引用
  • 您需要在汇总数据之前清除重复项。这是最简单的方法,不会使代码变得更复杂。
【解决方案2】:

DISTINCT 本身可能有点贵。就个人而言,我更喜欢使用 A CTE 和 ROW_NUMBER:

WITH CTE AS(
    SELECT *,
           ROW_NUMBER() OVER (PARTITION BY DateID ORDER BY DateID) AS RN
    FROM #Data)
SELECT SUM(HOUR) AS HOURS, AMT, PayEndingDate, CHECKDATE
FROM CTE
WHERE RN = 1
GROUP BY AMT, PayEndingDate, CHECKDATE;

【讨论】:

  • 不,除非使用不当。 I 是一个表达式,就像一个 CASE。你是从哪里得到这个想法的?
猜你喜欢
  • 1970-01-01
  • 2013-03-16
  • 2019-09-03
  • 2020-11-27
  • 1970-01-01
  • 1970-01-01
  • 2017-06-06
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多