T-SQL:组合两个表,然后加入

时间:2016-02-09 16:45:07

标签: sql-server tsql

我有两个表(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

有什么建议吗?

谢谢!

2 个答案:

答案 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;

结果:

enter image description here