@suhuxa1

Как составить такой sql запрос?

Привет!
Есть 2 таблицы. Одна с доходами, вторая с расходами. Общего в них только даты. Структура у обоих такая:
Доход:
id | date | income | summa
Расход:
id | date | outcome | summa

Задача: Вывести на экран по дням доходы\расходы. Т.е такую таблицу:
07-04-2018 - Доход: 800, Расход: 500
08-04-2019 - Доход: 900, Расход: 600

И тд.

ВАЖНО: В таблицах у каждого дня может быть много записей. То есть, в таблицах Доход\Расход уже не сумарное значение дается, а множество мелких, а мне как раз сумарные надо вывести.

Я написал такой код, но что-то выводится фигня. Во-первых, только 1 дата, во-вторых, итоговые значения какие-то большие. Например, у меня за 1 апреля лишь 3 дохода было: 100 рублей, 300 и 500. А итоговый доход за 1 апреля мне вылез в 4 тысячи. Почему - не знаю. Надеюсь поможете исправить код, спасибо!

SELECT p.date, SUM(p.income) as inc, SUM(c.summa) as total 
FROM `payments` as p 
LEFT JOIN cash as c 
ON p.date = c.date


p.income (поле с доходами), c.summa (тут у нас все расходы)
Даты одинаковые, формата: 01-04-2018
  • Вопрос задан
  • 427 просмотров
Решения вопроса 1
@mletov
SELECT t1.date,
	   t2.income,
	   t3.outcome
FROM
(
	SELECT date 
	FROM payments
	UNION
	SELECT date
	FROM cash	
) AS t1
LEFT JOIN
(
	SELECT date,
	       SUM(income) AS income
	FROM payments	   
	GROUP BY date
) AS t2
ON t1.date=t2.date
LEFT JOIN
(
	SELECT date,
	       SUM(summa) AS outcome
	FROM payments	   
	GROUP BY date
) AS t3
ON t1.date=t3.date
Ответ написан
Пригласить эксперта
Ответы на вопрос 3
@lblb
А колонки income и outcome - это зачем?

Как-то так:

select date
	, sum( case when ppcc.dt = 1 then ppcc.sum else 0 end )
	, sum( case when ppcc.dt = 0 then ppcc.sum else 0 end )	
from (
	select
		pp.date		as date
		, 1			as dt
		, pp.sum 	as sum
	from payments pp
	union all
	select
		pp.date		as date
		, 0			as dt
		, pp.sum 	as sum
	from cash cc
	) ppcc
group by ppcc.date


зы. Было бы правильно всё хранить в одной таблице, тогда бы и вопрос и не возникал.
Ответ написан
Комментировать
@4604590
JavaScript, HTML/CSS, PHP,MySQL, SuiteCRM/SugarCRM
добавьте group by p.date
Ответ написан
@d-stream
Готовые решения - не подаю, но...
select 
date,
sum(dbt),
sum(crd)
from(
select date, summa as dbt, 0 as crd  from t1
union all
select date, 0 as dbt, summa as crd from t2
) as t3 
group by date
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы