Вычесть несколько значений, возвращаемых запросом SQL

У меня есть таблица transaction, в которой есть столбцы amount, date и type, тип — это поле идентификатора, которое принадлежит выбору earning, expenses, скажем, id=1 — доход, а id=2 — расходы.

Я хочу получать ежемесячные сбережения за счет:

savings = earning - expenses

Я могу получить все транзакции отдельно:

select amount from transaction where id='1'  -- will give earnings
select amount from transaction where id='2'  -- will give expenses

Эти два запроса возвращают несколько результатов, потому что может быть много транзакций доходов и расходов.

Я получил общую экономию за счет:

select (select SUM(transaction.amount) from transaction where id='1') - 
(select SUM(transaction.amount) from transaction where id='2') as savings;

НО

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

Как вычесть два результата запроса, которые возвращают несколько значений, и сгруппировать их по дате?

Я использую PostgreSQL

какую бд вы используете? почему вы пометили mysql?

Andronicus 18.03.2022 14:43

Если возможно, почему бы вам не изменить дизайн стола?

Ravi Parekh 18.03.2022 14:57
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
2
26
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы можете сделать это в одном запросе:

select date_trunc('month', "date") as month, 
       SUM(transaction.amount) filter (where id = 1) 
        - 
       SUM(transaction.amount) filter (where id = 2) as savings
from transaction 
group by date_trunc('month', "date");

интуитивно я бы посоветовал вам попробовать такое решение:

SELECT tot_expense-tot_saving, tot_expense, tot_saving, month
FROM (select SUM(transaction.amount) tot_expense, month from transaction where 
id='1' group by month) as amount
LEFT JOIN (select SUM(transaction.amount) tot_saving, month from transaction 
WHERE id='2' group by month) as savings ON amount.month=savings.month

Я помещу все поле в SELECT для контрольной проверки. (Редактировать: забыли группу во втором выборе)

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