SQLServer:求和值并从两个不同的表中查找差异

SQLServer:求和值并从两个不同的表中查找差异,sql,sql-server,Sql,Sql Server,我有以下两个表,我想找出“一月”月份表1和表2之间的差异。差值应为表1中1月份所有值的总和减去表2中1月份所有值的总和 答案应该是300(800-500),但我的查询一直给我值“600” 我的问题是: SELECT a.month, (SUM(a.cost2)) - (SUM(b.cost2)) AS difference FROM Table1 a LEFT JOIN Table2 b ON a.Month = b.Month WHERE a.m

我有以下两个表,我想找出“一月”月份表1和表2之间的差异。差值应为表1中1月份所有值的总和减去表2中1月份所有值的总和

答案应该是300(800-500),但我的查询一直给我值“600”

我的问题是:

SELECT 
    a.month,
    (SUM(a.cost2)) - (SUM(b.cost2)) AS difference
FROM 
    Table1 a
LEFT JOIN 
    Table2 b ON a.Month = b.Month
WHERE 
    a.month = 'January'
GROUP BY 
    a.month
表1

Month    Cost2
--------------
January  500
February 400
March    300
April    600
January  300
March    200
March    400
April    200
表2

Month    Cost2
--------------
January  200
February 250
March    195
April    700
January  300
February 200
March    400
April    200

一种方法是先聚合,然后加入:

select a.month, (a_cost2 - b_cost2) as difference
from (select month, sum(a.cost2) as a_cost2
      from Table1 a
      where a.month = 'January'
      group by month
     ) a left join
     (select b.month, sum(b.cost2) as b_cost2
      from Table2 b
      where b.month = 'January'
      group by month
     ) b
     on a.Month = b.Month;

问题是,对于A中与“一月”匹配的每一行,您将对值求和一次。这将导致两个值加倍,并使差值加倍

要解决此问题,必须分别计算求和值。以下是一种方法:

select 'January'
    (SELECT sum(cost2) from Table1 where [month]='January') - 
    (SELECT sum(cost2) from Table2 where month='January') as difference

显然,在现实世界中,您可能需要一个类似“
DECLARE@month varchar(12)
”的变量,然后将月份分配给该变量,并用该变量替换每个月份的显式名称。您好-感谢您对值加倍的解释,这是有意义的,但我不确定如何写出完整的查询。我尝试了下面的解决方案,似乎奏效了。谢谢实际上,这是完整的查询。它应该根据过滤器输出您需要的内容。谢谢!这实际上是我试图做的(子查询),但我对它的了解几乎不存在。。。再次感谢:)学习调试自己的代码。删除聚合和GROUPBY子句,只需按月对连接的行进行排序。您将看到生成的行,这将帮助您理解计算不正确的原因。