Привет, я пробовал все решения в стеке через поток, но безрезультатно.
у меня есть 2 таблицы с первичным ключом идентификатора, затем дата и сумма. в таблице может быть несколько дат одной и той же даты. дебеты используют отрицательные числа в таблице дебетов
table "credits"
id | date | amount
1 2020-01-01 10.00
2 2020-01-02 20.00
3 2020-01-03 30.00
4 2020-01-01 10.00
5 2020-01-02 10.00
6 2020-01-03 10.00
table "debits"
id | date | amount
55 2020-01-01 -5.00
56 2020-01-02 -5.00
57 2020-01-03 -5.00
58 2020-01-01 -5.00
59 2020-01-02 -5.00
60 2020-01-03 -5.00
Я хочу вернуть результат из 3 столбцов, сгруппированный по ДАТЕ с 4 полями, датой, суммой кредитов (за день), суммой дебетов (за день) и общей суммой (за день)
date | amount_credits | amount_debits | amount_total
2020-01-01 20 10 10
2020-01-02 30 10 20
2020-01-03 40 10 30
Я бы сгруппировал обе таблицы по дате, а затем объединил бы их:
SELECT c.date, amount_credits, amount_debits, amount_credits - amount_debits AS amount_total
FROM (SELECT date, SUM(amount) AS amount_credits
FROM credits
GROUP BY date) c
JOIN (SELECT date, -1 * SUM(amount) AS amount_debits
FROM debits
GROUP BY date) d ON c.date = d.date
Я бы сделал это, используя union all
и аггрегацию:
select date, sum(credit) as credits, abs(sum(debits)) as debits),
sum(credits) + sum(debits) as net
from ((select c.date, c.amount as credit, 0 as debit
from credits c
) union all
(select c.date, 0, d.amount
from debits d
)
) cd
group by date;
Отмечу, что знак суммы списания меняется от исходной таблицы к результирующему набору, поэтому во внешнем запросе используется abs()
.
В частности, использование union all
и group by
гарантирует, что все даты в исходных данных будут в наборе результатов, даже если дата находится только в одной из таблиц.