合并两个表并获得总和而不从巨大的表中选择所有

时间:2013-09-18 11:25:46

标签: sql sql-server sum

我有两个具有相同架构的用户表。

|  useraward_new   |     |  useraward_his   |
|  User  |  Award  |     |  User  |  Award  |
|  user1 |    5    |     |  user1 |    1    |
|  user2 |    2    |     |  user1 |    3    |
|        |         |     |  user2 |    4    |
|        |         |     |  user3 |    5    |

useraward_new包含最新年份的数据,useraward_his包含历史数据。 区别在于'new'.User是唯一的但是'他'。用户并非如此'他'可​​能包含重复的用户数据。

我想

|  useraward_total |
|  User  |  Award  |
|  user1 |    9    |
|  user2 |    6    |

UNION工作正常。 但它返回历史表中包含的所有数据,但只需要新表中用户的数据。

我尝试了JOIN,UNION,SUM等各种组合......但没有运气。 任何帮助将不胜感激,谢谢!

5 个答案:

答案 0 :(得分:3)

SELECT n.[User], n.Award + ISNULL(SUM(h.Award),0) AS Award
FROM useraward_new n
LEFT JOIN useraward_his h ON h.[User] = n.[User]
GROUP BY n.[User], n.Award

答案 1 :(得分:0)

您需要从新表中进行选择,并在历史表上执行内部联接:

SELECT User, SUM(Award)
FROM useraward_new N
INNER JOIN useraward_his H ON N.User = H.User
GROUP BY User

编辑:我想这假设在历史表中总会有一个等效的用户。否则Markus的答案将包括新的用户,这些用户不在历史表中。

答案 2 :(得分:0)

您可以使用EXISTS仅从历史记录表中选择新表中的用户。然后使用UNION ALLGROUP BY

SELECT X.[User], SUM(X.Award) AS Award
FROM(
    SELECT [User], Award FROM useraward_new   
    UNION ALL
    SELECT [User], Award FROM useraward_his h 
    WHERE EXISTS( SELECT 1 FROM useraward_new n WHERE h.[User] = n.[User]) 
) X
GROUP BY [User]

DEMO

答案 3 :(得分:0)

SELECT Unew.User, Unew.Award + Uold.oldAwards
FROM Useraward_new AS Unew
LEFT JOIN
 (
   SELECT User, SUM(Award) as oldAwards
   FROM useraward_his
   GROUP BY User
 ) Uold
ON Unew.User = Uold.User

如果两个表中都存在大多数用户,则无需在连接之前进行过滤,这将比聚合不需要的行的开销更大。

答案 4 :(得分:0)

请尝试:

select 
    a.[User], 
    a.Award+(select SUM(b.Award) from useraward_his b where a.[User]=b.[User]) Award
from useraward_new a