T-SQL:将两个表分组,然后连接

Dis*_*sti 1 t-sql sql-server

我有两个表(OldVals 和 NewVals),两者都具有相同的格式:

PK ProductID  int
PK CustomerID int
   Value      decimal
Run Code Online (Sandbox Code Playgroud)

一些示例数据:

老瓦尔斯:

ProductID   CustomerID  Value
1           1000        10
2           1000        20
3           1000        30
1           2000        40
4           2000        50
2           3000        60
3           3000        70
4           3000        80
Run Code Online (Sandbox Code Playgroud)

新瓦尔斯:

ProductID   CustomerID  Value
1           1000        50
2           1000        60
1           2000        70
2           3000        80
3           3000        90
Run Code Online (Sandbox Code Playgroud)

我正在尝试查询这两个表并获取:CustomerID、OldVals 中每个客户的值总和、NewVals 中每个客户的值总和。ProductID 被忽略。

给定样本数据的结果将是:

CustomerID  SumOld  SumNew
1000        60      110
2000        90      70
3000        210     170
Run Code Online (Sandbox Code Playgroud)

通过这个查询:

select
    OldVals.CustomerID,
    sum(distinct OldVals.Value),
    sum(distinct NewVals.Value) 

from
    OldVals full outer join NewVals on OldVals.CustomerID = NewVals.CustomerID

group by OldVals.CustomerID, NewVals.CustomerID
Run Code Online (Sandbox Code Playgroud)

我为给定的示例数据获得了正确的结果,但是当然,如​​果同一客户的两行的“值”字段相同,则查询会给出错误的结果,因为具有相同值的行(在客户内)是仅求和一次。

只是为了澄清,如果我将 OldVals 的第一行替换为:

ProductID   CustomerID  Value
1           1000        20
Run Code Online (Sandbox Code Playgroud)

结果应该是:

CustomerID  SumOld  SumNew
1000        70      110
...
Run Code Online (Sandbox Code Playgroud)

但我得到:

CustomerID  SumOld  SumNew
1000        50      110
Run Code Online (Sandbox Code Playgroud)

有什么建议吗?

谢谢你!

Gio*_*sos 5

您可以使用:

SELECT t1.CustomerID , oldSum, newSum
FROM (
   SELECT CustomerID, SUM(Value) AS oldSum
   FROM OldVals
   GROUP BY CustomerID ) AS t1  
FULL OUTER JOIN (
   SELECT CustomerID, SUM(Value) AS newSum
   FROM NewVals
   GROUP BY CustomerID  
) AS t2 ON t1.CustomerID  = t2.CustomerID 
Run Code Online (Sandbox Code Playgroud)

这个想法是首先 GROUP BY对每个表进行操作,然后FULL JOIN对已经聚合的集合进行操作。