SQL Server将多行合并为一行 - 无临时表

时间:2014-04-10 14:50:19

标签: sql sql-server sql-server-2008

我希望看到这个SO问题中概述的最简洁的方法:Sum values from multiple rows into one row 也就是说,在对一列进行求和时组合多行。

但是如何删除重复项。换句话说,我有这样的数据:

Person  Value
--------------
1         10
1         20
2         15

我想将任何重复项(在Person col上)的值加到一行中,并删除Person值上的其他重复项。所以我的输出是:

Person  Value
-------------
1        30
2        15

我想在不使用临时表的情况下这样做。我认为我需要使用OVER PARTITION BY但不确定。只是试图挑战自己,不要以临时表的方式来做。使用SQL Server 2008 R2

简单地说,给我一个简洁的stmt从我的输入到同一个表中的输出。因此,如果我的表名是People,如果我在此问题的操作之前对其进行了select * from People,我会得到上面的第一组,然后当我执行select * from People之后操作,我得到上面的第二组数据。

2 个答案:

答案 0 :(得分:2)

不确定为什么不使用Temp表,但是这里有一种方法可以避免它(这可能是一种过度杀伤):

UPDATE MyTable SET VALUE = (SELECT SUM(Value) FROM MyTable MT WHERE MT.Person = MyTable.Person);

WITH DUP_TABLE AS
   (SELECT ROW_NUMBER()
    OVER (PARTITION BY Person ORDER BY Person) As ROW_NO
    FROM MyTable)
DELETE FROM DUP_TABLE WHERE ROW_NO > 1;

首先查询将每个重复的人更新为摘要值。第二个查询删除了重复的人。

演示:http://sqlfiddle.com/#!3/db7aa/11

答案 1 :(得分:0)

您要求的只是一个简单的SUM()汇总函数和GROUP BY

SELECT Person, SUM(Value)
FROM myTable
GROUP BY Person

SUM()本身会将列中的值相加,但是当您添加辅助列并GROUP BY时,SQL将显示辅助列中的不同值并执行聚合函数那些不同的类别。