【问题标题】:How to remove repeated data and sum its value on sql?如何删除重复数据并在sql上对其值求和?
【发布时间】:2016-05-19 08:58:16
【问题描述】:

假设我有一个名为“records”的数据库表,它包含三个实体“id”、“name”、“score”。

如果有重复的值比如;

id  name  score
1   ben   10
2   adam   4
3   sarah  2
4   ben    5
5   mark   3

既然有两个本我可以用这个sql语句删除其中一个

DELETE FROM records
WHERE id IN
( SELECT MAX(id) FROM records
GROUP BY name
HAVING COUNT(*) > 1)

但是我怎样才能将 ben 的值与其他 ben 相加并得到这样的结果;

id  name  score
1   ben    15
2   adam   4
3   sarah  2
5   mark   3

【问题讨论】:

    标签: sql sql-server tsql sql-delete


    【解决方案1】:
    SELECT Min(id) as id ,name,SUM(score) as score FROM records
    GROUP BY name
    

    【讨论】:

      【解决方案2】:

      尝试以下查询:

      select id,name,sum(score) over (partition by name) score
      into #t1
      from test3
      order by id
      
      DELETE FROM #t1
      WHERE id IN
      (SELECT MAX(id) FROM #t1
      GROUP BY name
      HAVING COUNT(*) > 1)
      
      select * from #t1
      order by id
      
      drop table #t1
      

      【讨论】:

        【解决方案3】:

        你可以使用:

        -- get min(id) and total
        SELECT id = MIN(id),name, total = SUM(score)
        INTO #temp
        FROM records
        GROUP BY name;
        
        -- update score
        UPDATE r
        SET score = total
        FROM records r
        JOIN #temp t
          ON r.name = t.name;
        
        -- delete redundant rows
        DELETE r
        FROM records r
        LEFT JOIN #temp t
         ON r.id = t.id
        WHERE t.id IS NULL;
        
        SELECT * FROM records;
        

        LiveDemo


        使用MERGE

        MERGE records AS tgt
        USING (SELECT id = MIN(id),name, total = SUM(score)
               FROM records
               GROUP BY name) AS src
         ON tgt.name = src.name
        WHEN MATCHED AND tgt.id <> src.id THEN
          DELETE
        WHEN MATCHED THEN
          UPDATE SET score = total;
        

        LiveDemo2

        输出:

        ╔════╦═══════╦═══════╗
        ║ id ║ name  ║ score ║
        ╠════╬═══════╬═══════╣
        ║  1 ║ ben   ║    15 ║
        ║  2 ║ adam  ║     4 ║
        ║  3 ║ sarah ║     2 ║
        ║  5 ║ mark  ║     3 ║
        ╚════╩═══════╩═══════╝
        

        【讨论】:

        • 第二个合并在演示中效果很好,但是在我的代码中实现它时我得到了这个错误 MERGE 语句必须由分号 (;) 终止。这是我的代码dpaste.com/16DY5CN
        • @infoperto 使用 ;MERGE 分号是强制性的。您应该始终以 ; 结束每个语句,这是一种良好的做法。
        • 我没看懂。不都是一条sql语句。我应该添加;在合并之前?,merge 是所有语句中的第一个单词
        【解决方案4】:

        使用这个查询:

        --This will delete all duplicate records except their first occurrence. You may ignore this part if you do not need to delete
        DELETE FROM T 
        WHERE Id IN (
                     SELECT Id FROM(
                                    --This select will produce the result that you are looking for
                                    SELECT Id, 
                                           name, 
                                           SUM(Score)OVER(PARTITION BY name) AS S,
                                           ROW_NUMBER()OVER(PARTITION BY name ORDER BY Id ) AS RN
                                    FROM T
                                   ) AS K WHERE RN>1
                     )
        

        【讨论】:

          猜你喜欢
          • 2015-11-06
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-05-24
          • 2014-07-15
          相关资源
          最近更新 更多