我有两个具有相同架构的用户表。
| 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等各种组合......但没有运气。 任何帮助将不胜感激,谢谢!
答案 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 ALL
和GROUP 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]
答案 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