#php #mysql
#php #mysql
Вопрос:
Я изменил свою транзакцию на одну единственную таблицу. Как я могу показать начальный баланс и конечный баланс на основе выбранной даты.
Вот моя новая таблица транзакций.
ИМЯ TBL: transaction_history
trans_itemdesc | trans_qtyin | trans_wtin | trans_datein | trans_qtyout | trans_wtout | trans_dateout | Статус |
---|---|---|---|---|---|---|---|
Item1 | 500 | 5000 | 2020-11-01 | ||||
Item2 | 300 | 3000 | 2020-11-25 | ||||
Item1 | 200 | 2000 | 2020-11-01 | ||||
Item1 | 50 | 2020-11-11 | |||||
Item2 | 25 | 2020-11-31 | Открыть | ||||
Item1 | 40 | 2020-11-31 | Открыть | ||||
Item1 | 100 | 2020-11-04 | Открыть |
Желаемый результат по состоянию на ноябрь
Продукт | БегБал | В | Выход | EndBal |
---|---|---|---|---|
Item1 | 0 | 700 | 140 | 560 |
Item2 | 0 | 300 | 25 | 275 |
Вывод на следующий месяц
Продукт | БегБал | В | Выход | EndBal |
---|---|---|---|---|
Item1 | 560 | 0 | 0 | 660 |
Item2 | 275 | 0 | 0 | 275 |
Начальный баланс должен содержать конечный баланс за следующий месяц.
Комментарии:
1. с вашими изменениями ваши примерные начальные балансы больше не имеют смысла; объясните, как вы это вычисляете?
2. Начальный балл — это сумма конечного балла за предыдущий месяц начало месяца.
3. Рассмотрите возможность хранения всех транзакций в одной таблице
4. @SprakenDude Я понимаю это, но как вы вычисляете это из своих данных? откуда берется «800» для элемента 1 в ноябре, когда до ноября нет входящих или исходящих записей?
5. @ysth да, нет записей до ноября, но в ноябре есть In, который равен 800, поэтому 0 с предыдущего месяца IN в ноябре = 800
Ответ №1:
У вас действительно должна быть только одна таблица; отдельные входные и выходные таблицы создают больше проблем, чем решают. Угадывая некоторые из ваших имен столбцов, я подозреваю, что на самом деле у вас нет столбца с именем «Дата выхода» и т. Д
select product as Product,
coalesce(sum(case when dt < '2020-12-01' then amount end),0) as BegBal,
coalesce(sum(case when dt between '2020-12-01' and '2020-12-31' and type='in' then amount end),0) as In,
coalesce(sum(case when dt between '2020-12-01' and '2020-12-31' and type='out' then -amount end),0) as Out,
coalesce(sum(case when dt <= '2020-12-31' then amount end),0) as EndBal
from (
select 'in' as type, product, date_in as dt, in as amount from in
union all
select 'out' as type, product, date_out, -amount from out
) in_out;
Комментарии:
1. можете ли вы помочь мне с подзапросами, получающими начальный баланс, вход, выход и конечный баланс на основе выбранной даты. Я уже изменил свою таблицу на одну таблицу.