1

同じスキーマを持つ 2 つのユーザー テーブルがあります。

|  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 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 User, SUM(Award)
FROM useraward_new N
INNER JOIN useraward_his H ON N.User = H.User
GROUP BY User

編集:これは、履歴テーブルに同等のユーザーが常に存在すると想定していると思います。それ以外の場合、Markus の回答には、履歴テーブルにない新しいユーザーが含まれます。

于 2013-09-18T11:28:34.360 に答える
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]

DEMO

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