1

DB-小提琴:

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。 b) 所有其他均指相同。flow_type stock
flow_typesflow_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到查询中。

我需要在查询中进行哪些更改才能获得预期的结果?

4

1 回答 1

0

您可以使用窗口函数和聚合:

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 | 股票_昨天 | 入境 | 出境 | 今日股票
:--------- | --------------: | ------: | --------: | ----------:
2020-04-18 |            | 500 | -400 | 100
2020-04-19 | 100 | 800 | -650 | 250
2020-04-20 | 250 | 730 | -600 | 380
2020-04-21 | 380 | 420 | -370 | 430
于 2020-04-27T10:07:29.417 回答