MySQL SUM два столбца, затем еще один столбец с чистой суммой

Привет, я пробовал все решения в стеке через поток, но безрезультатно.

у меня есть 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
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
Освоение архитектуры микросервисов с Laravel: Лучшие практики, преимущества и советы для разработчиков
В последние годы архитектура микросервисов приобрела популярность как способ построения масштабируемых и гибких приложений. Laravel , популярный PHP...
Как построить CRUD-приложение в Laravel
Как построить CRUD-приложение в Laravel
Laravel - это популярный PHP-фреймворк, который позволяет быстро и легко создавать веб-приложения. Одной из наиболее распространенных задач в...
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
Освоение PHP и управление базами данных: Создание собственной СУБД - часть II
В предыдущем посте мы создали функциональность вставки и чтения для нашей динамической СУБД. В этом посте мы собираемся реализовать функции обновления...
Документирование API с помощью Swagger на Springboot
Документирование API с помощью Swagger на Springboot
В предыдущей статье мы уже узнали, как создать Rest API с помощью Springboot и MySql .
Роли и разрешения пользователей без пакета Laravel 9
Роли и разрешения пользователей без пакета Laravel 9
Этот пост изначально был опубликован на techsolutionstuff.com .
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
Как установить LAMP Stack - Security 5/5 на виртуальную машину Azure Linux VM
В предыдущей статье мы завершили установку базы данных, для тех, кто не знает.
1
0
184
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Я бы сгруппировал обе таблицы по дате, а затем объединил бы их:

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 гарантирует, что все даты в исходных данных будут в наборе результатов, даже если дата находится только в одной из таблиц.

Другие вопросы по теме