查询返回不正确的结果

时间:2020-05-02 20:23:15

标签: sql sql-server sql-server-2012

我正在尝试编写查询,但结果错误。让我与您分享详细信息。我有两张桌子。首先是tbl1

Id   |  NId  | value  |  VID
-----+-------+--------+-----
170  |  44   |   5    |   12
170  |  44   |   2    |   12
170  |  44   |   1    |   12
170  |  44   |   1    |   12
170  |  44   |   1    |   12
170  |  44   |   1    |   12

第二个表是tbl2

Id   |  NId  | value  |  VID
-----+-------+--------+-----
170  |  44   |   5    |   12
170  |  44   |   4    |   12
170  |  44   |   5    |   12
170  |  44   |   5    |   12
170  |  44   |   4    |   12
170  |  44   |   5    |   12

这些是示例表。我想要的是对两个表中的列值求和,然后对其求和,然后减去它。让我向您显示查询。

SELECT SUM(a.value) - SUM(b.value) AS res
FROM tbl1 AS  a
INNER JOIN tbl2 AS b ON a.VID = b.VID
WHERE a.VID = 12; 

tbl1的列值的总和是11,表2的列的总和是28。我想要的结果是-17(将两个表中的值相加然后减去它们)。但是我得到的答案是23。

2 个答案:

答案 0 :(得分:1)

您必须先汇总 联接,因为两个表中都有重复项:

SELECT (a.value - b.value) AS res
FROM (SELECT SUM(value) as value
      FROM tbl1
      WHERE a.VID = 12
     ) a CROSS JOIN
     (SELECT SUM(value) as value
      FROM tbl1
      WHERE a.VID = 12
     ) b;

要查看查询正在聚合的内容,请在不进行聚合的情况下运行查询:

SELECT a.*, b.*
FROM tbl1 a INNER JOIN
     tbl2 b
     ON a.VID = b.VID
WHERE a.VID = 12; 

这将帮助您了解JOIN中正在发生的事情-以及为什么结果不是您想要的。

答案 1 :(得分:1)

最简单的方法是直接减去总和:

select 
  (select sum(value) from tbl1 where VID = 12) - 
  (select sum(value) from tbl2 where VID = 12) AS res

请参见demo
结果:

> | res |
> | --: |
> | -17 |