我有两个表(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)
有什么建议吗?
谢谢你!
您可以使用:
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对已经聚合的集合进行操作。
| 归档时间: |
|
| 查看次数: |
3202 次 |
| 最近记录: |