如何从表中删除重复的行,但保持列值的总和

时间:2018-07-17 09:28:55

标签: sql sql-server sql-server-2012

假设有一个表,该表具有多个相同的行。我可以通过

复制不同的值
SELECT DISTINCT * INTO DESTINATIONTABLE FROM SOURCETABLE 

,但是如果该表具有名为value的列,并且为简单起见,对于该表中的一个特定项,其值为1。现在,该行还有9个重复项。因此,该特定项目的value列的总和为10。现在,我要删除9个重复项(或复制我提到的唯一值),对于该项目,该值现在应显示10而不是1。达到了?

item|     value      
----+----------------
  A | 1
  A | 1
  A | 1
  A | 1
  B | 1
  B | 1

我想显示如下

item|     value      
----+----------------
  A | 4
  B | 2

预先感谢

2 个答案:

答案 0 :(得分:1)

您可以尝试使用SUMgroup by

SELECT item,SUM(value) value      
FROM T 
GROUP BY item

SQLfiddle:http://sqlfiddle.com/#!18/fac26/1

[结果]

| item | value |
|------|-------|
|    A |     4 |
|    B |     2 |

答案 1 :(得分:0)

从广义上讲,您可以给我们一个和和一个GROUP BY子句。

类似的东西:

SELECT column1, SUM(column2) AS Count 
FROM SOURCETABLE
GROUP BY column1

这里正在起作用:Sum + Group By

由于您的表可能不仅是两列数据,因此以下是一个稍微复杂的示例,该示例显示了如何对更大的表执行此操作:SQL Fiddle

请注意,我已经单独选择了行,以便可以访问必要的数据,而不是使用

SELECT *

我已经实现了这一结果,而无需将数据选择到另一个表中。

编辑2

在您的注释之后,听起来您想更改表中的实际数据,而不仅仅是查询它。可能有一种更优雅的方法来执行此操作,但是一种简单的方法是使用以上查询来填充临时表,删除现有表的内容,然后将所有数据移回。要在现有示例中做到这一点:

WITH MyQuery AS (
 SELECT name, type, colour, price, SUM(number) AS number
 FROM MyTable
 GROUP BY name, type, colour, price
)
SELECT * INTO MyTable2 FROM MyQuery;

DELETE FROM MyTable;

INSERT INTO MyTable(name, type, colour, price, number) 
SELECT * FROM MyTable2;

DROP TABLE MyTable2;

警告:如果您要尝试使用此功能,请先使用开发环境(即您不介意破坏环境!),以确保其能够完全满足您的要求。您的初始查询必须捕获所需的数据 ALL

以下是该示例的SQL Fiddle:SQL Fiddle