2014-04-10 73 views
0

我希望看到一个最简洁的方法来完成这个SO问题中概述的内容:Sum values from multiple rows into one row 也就是说,在合计列时组合多行。SQL Server将多个行合并为一个 - 没有临时表

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

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

我要总结的值任何重复(的人列)成单行和摆脱对个人价值的其他重复的。所以我的输出将是:

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

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

简而言之,给我一个简短的说明,从我的输入到同一个表中的输出。所以如果我的表名是People,如果我在这个问题中要求的操作之前对它做了select * from People,那么我会得到上面的第一个集合,然后当我在操作后执行select * from People时,我会得到上面的第二组数据。

+1

你的意思是'SELECT人,SUM(值)YourTable GROUP BY Person'?这将产生你描述的结果 –

+0

如果你想**“摆脱其他重复的个人价值”**那么为什么30对Id 1 ??不应该是10或20? –

+0

我想我还没有让自己清楚:我想合并具有相同Person值的所有行,同时将这些值相加。是的,@Yuriy确定这是获得结果的简单答案,现在我想用相同的方式将结果留在同一个(源)表中。 (换句话说,您的答案必须告诉我如何使用新值更新现有记录 - 或插入新值 - 然后删除具有相同Person值的所有其他记录。简而言之,请给我一个简洁的说明我的输入在同一个表中输出 –

回答

2

不知道为什么不使用临时表,但这里的,以避免它(寿恕我直言,这是矫枉过正)的一种方法:

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

+0

中进行更改,谢谢@Yuriy Galanter。是的,在不使用temp的情况下有点虚假,但我想看看它是如何完成的 –

0

所有你问的是一个简单的SUM()聚合函数和GROUP BY

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

SUM()本身会总结值一列,但是当你添加辅助列,并GROUP BY它, SQL将显示来自辅助列的不同值,并通过这些不同的类别执行集合函数。

+0

请看我上面的评论。我需要stmt在源表 –