Добрый день. Помогите, пожалуйста, разобраться с запросом. Вывожу остатки за весь период по дням. Первая запись выводится верно, а дальше уже к остальным записям где были движения в начальный остаток прибавляется количество первой записи. Пример: 5 мая был приход 10 штук, расход 4, остаток начальный 0, конечный 6. Следующее движение по этой позиции было 10 мая. Приход 5, расход 2, начальный остаток 6, конечный 9. Еще одно движение было 12 мая. Приход 3, расход 0, начальный остаток 9, конечный 12. Запросом выводится в таком виде:
05.05.2024 Начальный остаток 0, Приход 10, Расход 4, Конечный остаток 6,
06.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
07.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
08.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
09.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
10.05.2024 Начальный остаток 12, Приход 5, Расход 0, Конечный остаток 17,
11.05.2024 Начальный остаток 17, Приход 0, Расход 0, Конечный остаток 17,
12.05.2024 Начальный остаток 23, Приход 3, Расход 0, Конечный остаток 26 и так далее.
create temporary table dateList as (SEL ECT * FROM generate_series(
(sel ect min(abs.date) from account_bank_statement abs)::date,
now(),
'1 day'
));
create temporary table tempTable as (select
rc.name "company",
aj.name "bank",
resC.name "currency",
abs.date "date",
abs.balance_start "balance_start",
abs.total_entry_encoding,
abs.balance_end "balance_end",
CASE
WHEN total_entry_encoding> 0 THEN total_entry_encoding
WHEN total_entry_encoding<= 0 THEN 0
END entry,
CASE
WHEN total_entry_encoding< 0 THEN total_entry_encoding
WHEN total_entry_encoding>= 0 THEN 0
END outgoing
fr om
account_bank_statement abs
left join
res_company rc
on
abs.company_id = rc.id
left join
account_journal aj
on
abs.journal_id = aj.id
left join
res_currency resC
on
aj.currency_id = resC.id
);
select
tempTable.company "Компания",
tempTable.bank "Банк",
tempTable.currency "Валюта",
dateList.generate_series "Дата",
case when dateList.generate_series = tempTable.date then
tempTable.balance_start
else tempTable.balance_end end "Остаток на начало",
tempTable.balance_end "Остаток на конец",
CASE
when dateList.generate_series = tempTable.date then
tempTable.entry
else 0 end Приход,
CASE
when dateList.generate_series = tempTable.date then
tempTable.outgoing else 0 end Расход
fr om
dateList dateList
left join
tempTable tempTable
on
tempTable.date <= dateList.generate_series
Первая запись выводится верно, а дальше уже к остальным записям где были движения в начальный остаток прибавляется количество первой записи. Пример: 5 мая был приход 10 штук, расход 4, остаток начальный 0, конечный 6. Следующее движение по этой позиции было 10 мая. Приход 5, расход 2, начальный остаток 6, конечный 9. Еще одно движение было 12 мая. Приход 3, расход 0, начальный остаток 9, конечный 12.
ошибся, к следующей записи прибавляется количество предыдущей записи (правильное количество). То есть работает сейчас так:
05.05.2024 Начальный остаток 0, Приход 10, Расход 4, Конечный остаток 6,
06.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
07.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
08.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
09.05.2024 Начальный остаток 6, Приход 0, Расход 0, Конечный остаток 6,
10.05.2024 Начальный остаток 12, Приход 5, Расход 0, Конечный остаток 17, //тут начальный остаток должен быть 6, прибавляется он и к начальному и к конечному (с учетом прихода выходит 17)
11.05.2024 Начальный остаток 17, Приход 0, Расход 0, Конечный остаток 17,
12.05.2024 Начальный остаток 26, Приход 3, Расход 0, Конечный остаток 29 и так далее. //тут начальный остаток должен быть 9, он прибавляется к конечному из предыдущей записи, с приходом конечный выходит 29