Добавить значение с предыдущей датой к фактической дате в результате запроса - PullRequest
1 голос
/ 27 апреля 2020

DB-Fiddle:

CREATE TABLE logistics (
    id int auto_increment primary key,
    flow_date DATE,
    flow_type VARCHAR(255),
    flow_quantity INT
);

INSERT INTO logistics
(flow_date, flow_type, flow_quantity
)
VALUES 
("2020-04-18", "inbound", "500"),
("2020-04-18", "outbound", "400"),
("2020-04-18", "stock", "100"),
("2020-04-19", "inbound", "800"),
("2020-04-19", "outbound", "650"),
("2020-04-19", "stock", "250"),
("2020-04-20", "inbound", "730"),
("2020-04-20", "outbound", "600"),
("2020-04-20", "stock", "380"),
("2020-04-21", "inbound", "420"),
("2020-04-21", "outbound","370"),
("2020-04-21", "stock", "430");

Ожидаемый результат:

flow_date     stock_yesterday   inbound    outbound    stock_today
2020-04-18         0              500        -400         100        
2020-04-19        100             800        -650         250
2020-04-20        250             730        -600         380
2020-04-21        380             420        -370         430

В основном В моем результате я хочу показать этот таймлайм: stock_yesterday + inbound - outbound = stock_today.
Поэтому мне нужно изменить исходную таблицу следующим образом:

a) flow_types используются в качестве columns в результате.
a) stock_yesterday - это flow_quantity из flow_type stock предыдущего дня.
б) Все остальные flow_types относятся к тому же flow_date.


До сих пор я придумал этот запрос, но не смог заставить его работать:

SELECT
flow_date,
(CASE WHEN flow_type = "inbound" THEN flow_quantity END) AS inbound,
(CASE WHEN flow_type = "outbound" THEN flow_quantity END) AS outbound,
(CASE WHEN flow_type = "stock" THEN flow_quantity END) AS stock_today
FROM logistics
GROUP BY 1;

Отображает только inbound.
Я также понятия не имею, как я могу добавить stock_yesterday к запросу.

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

1 Ответ

0 голосов
/ 27 апреля 2020

Вы можете использовать оконные функции и агрегирование:

select
    flow_date,
    sum(inbound + outbound) 
        over(order by flow_date rows between unbounded preceding and 1 preceding) stock_yesterday,
    inbound,
    outbound,
    sum(inbound + outbound) over(order by flow_date) stock_today
from (
    select 
        flow_date,
        sum(case when flow_type = 'inbound' then flow_quantity else 0 end) inbound,
        sum(case when flow_type = 'outbound' then -flow_quantity else 0 end) outbound
    from logistics
    group by flow_date
) t
order by flow_date

Подзапрос не является строго необходимым, но он помогает сократить синтаксис.

Демонстрация на DB Fiddle :

flow_date  | stock_yesterday | inbound | outbound | stock_today
:--------- | --------------: | ------: | -------: | ----------:
2020-04-18 |            <em>null</em> |     500 |     -400 |         100
2020-04-19 |             100 |     800 |     -650 |         250
2020-04-20 |             250 |     730 |     -600 |         380
2020-04-21 |             380 |     420 |     -370 |         430
...