1

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

|  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 是唯一的,但 'his'.User 不是,所以 'his' 可能包含重复的用户数据。

我想拥有

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

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

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

4

5 回答 5

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
于 2013-09-18T11:28:26.530 回答
0

您需要从新表中进行选择并对历史表进行内部联接:

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

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

于 2013-09-18T11:28:34.360 回答
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

于 2013-09-18T11:29:16.977 回答
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

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

于 2013-09-18T11:32:54.180 回答
0

请试试:

select 
    a.[User], 
    a.Award+(select SUM(b.Award) from useraward_his b where a.[User]=b.[User]) Award
from useraward_new a 
于 2013-09-18T11:42:39.563 回答