我希望看到一种最简洁的方法来完成这个SO问题中概述的内容:Sum values from multiple rows into one row,即合并多个行,同时对一列进行求和。
但如何删除副本。换句话说,我有这样的数据:
Person Value
--------------
1 10
1 20
2 15我希望将任何重复( Person )的值求和到一行中,并去掉Person值上的其他重复值。所以我的产出是:
Person Value
-------------
1 30
2 15我不想用临时表来做这件事。我想我需要使用OVER PARTITION BY,但不确定。只是想挑战我自己不要用临时表的方式。使用Server 2008 R2
简单地说,给我一个简洁的stmt从我的输入到我在同一表中的输出。所以如果我的表名是People,如果我在这个问题中所问的操作之前对它做了一个select * from People,我得到上面的第一个集合,然后当我在操作之后做一个select * from People时,我得到上面的第二个数据集。
发布于 2014-04-10 15:39:52
不知道为什么不使用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
发布于 2014-04-10 14:56:22
您所要求的只是一个简单的SUM()聚合函数和一个GROUP BY
SELECT Person, SUM(Value)
FROM myTable
GROUP BY PersonSUM()本身将总结列中的值,但是当您添加辅助列和GROUP BY列时,SQL将显示来自辅助列的不同值,并根据这些不同的类别执行聚合函数。
https://stackoverflow.com/questions/22991518
复制相似问题