Запрос вернул неверный результат - PullRequest
0 голосов
/ 02 мая 2020

Я пытаюсь написать запрос, но получаю неправильный результат. Позвольте мне поделиться с вами деталями. У меня есть две таблицы. Во-первых, это 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
AND second table is 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 ]

1 голос
/ 02 мая 2020

Самый простой способ сделать это - вычесть суммы напрямую:

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

См. Демоверсию . Результат:

> | res |
> | --: |
> | -17 |
1 голос
/ 02 мая 2020

Вы должны агрегировать до объединения , поскольку в обеих таблицах есть дубликаты:

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 - и почему ваши результаты не соответствуют вашим ожиданиям.

...