mysql вычитать несколько таблиц НЕ работает должным образом - PullRequest
1 голос
/ 02 апреля 2020

Я пытался вычесть значения из нескольких таблиц, но результаты были неправильными.

SELECT SUM(t1.pay_1) - SUM(t2.pay_2) as trx FROM
(
SELECT SUM(payment) AS pay_1
FROM tr_order
WHERE date = '".$date."' 
AND agent='".$arr[$y]['name']."'

UNION ALL

SELECT SUM(nominal) AS pay_1
FROM transaction
WHERE date = '".$date."'
AND to_agent='".$arr[$y]['name']."') AS t1,                                                                               

(SELECT SUM(nominal) AS pay_2
FROM transaction
WHERE date = '".$date."'
AND from_agent='".$arr[$y]['name']."') AS t2                                                                                

результат t1.pay_1 равен 350000, а результат t2.pay_2 равен 0

но результат t1.pay_1 - t2.pay_2 равен 0

что не так?

1 Ответ

0 голосов
/ 02 апреля 2020

Если там подзапрос t2 или t1 возвращает ноль, то основной запрос вернет ноль, вы всегда должны кодировать это, используя coalesce. Поскольку t1 потенциально возвращает 2 строки, вам нужно сложить pay_1 перед вычислением trx, чтобы избежать удвоения неявного перекрестного соединения. Упрощенная версия вашей модели и запроса иллюстрирует

drop table if exists t,t1;
create table t(payment int);
create table t1(nominal int, to_agent int, from_agent int);

insert into t values (10),(10);

select 
        payone,
        sum(pay_2) pay2,
        payone - sum(pay_2) pay1_pay2,
        coalesce(payone,0) - sum(coalesce(pay_2,0)) as trx
from
(
select sum(pay_1) payone from
(
select sum(payment) pay_1 from t
union all
select sum(nominal) pay_1 from t1 where to_agent = 1
) s
) a
,
(select sum(nominal) pay_2 from t1 where from_agent = 1) b;

 +------+------+-----------+------+
| pay1 | pay2 | pay1_pay2 | trx  |
+------+------+-----------+------+
|   20 | NULL |      NULL |   20 |
+------+------+-----------+------+
1 row in set (0.001 sec)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...