У меня есть таблица 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
Если возможно, почему бы вам не изменить дизайн стола?
Вы можете сделать это в одном запросе:
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 для контрольной проверки. (Редактировать: забыли группу во втором выборе)
какую бд вы используете? почему вы пометили mysql?