我有两个表(OldVals和NewVals),两个表格格式相同:
PK ProductID int
PK CustomerID int
Value decimal
一些示例数据:
OldVals:
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
NEWVALS:
ProductID CustomerID Value
1 1000 50
2 1000 60
1 2000 70
2 3000 80
3 3000 90
我正在尝试查询这两个表并获取:CustomerID,OldVals中每个客户的值总和,NewVals中每个客户的值总和。 ProductID被忽略。
给定样本数据的结果如下:
CustomerID SumOld SumNew
1000 60 110
2000 90 70
3000 210 170
使用此查询:
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
我获得了给定样本数据的正确结果,但当然如果“Value”字段对于同一客户的两行是相同的,那么查询会给出错误的结果,因为具有相同值的行(在客户)只汇总一次。
只是为了澄清,如果我将OldVals的第一行替换为:
ProductID CustomerID Value
1 1000 20
结果应该是:
CustomerID SumOld SumNew
1000 70 110
...
但我得到了:
CustomerID SumOld SumNew
1000 50 110
有什么建议吗?
谢谢!
答案 0 :(得分:4)
您可以使用:
GROUP BY
我们的想法是首先 FULL JOIN
每个表,然后对已经聚合的集合执行{{1}}。
答案 1 :(得分:0)
您可以通过Giorgo提供的两个选择语句或公用表表达式来实现它:
;WITH A
AS
(SELECT CustomerID, SUM(Value) AS SumOld
FROM OldVals
GROUP BY CustomerID
),
B
AS
(SELECT CustomerID, SUM(Value) AS SumNew
FROM NewVals
GROUP BY CustomerID
)
SELECT A.CustomerID, A.SumOld, B.SumNew
FROM A
FULL OUTER JOIN
B
ON A.CustomerID = B.CustomerID;
结果: