使用PostgreSQL创建数据透视表

时间:2018-11-01 07:13:05

标签: postgresql

我有一张这样的桌子:

type    code    desc    store  Sales/Day  Stock
-----------------------------------------------
1       AA1     abc     101        3        6
1       AA2     abd     101        4        0
1       AA3     abf     101        4        3
2       BA1     bba     101        5        1
2       BA2     bbc     101        2        1
1       AA1     abc     102        1        4
1       AA2     abd     102        2        0
2       BA1     bba     102        4        2
2       BA2     bbc     102        5        5
etc.

我如何显示这样的结果表:

type    code    desc         Store 101             Store 102
                        Sales/Day | Stock    Sales/Day | Stock
--------------------------------------------------------------
1       AA1     abc        3          6         1          4
1       AA2     abd        4          0         2          0
1       AA3     abf        4          3         0          0
2       BA1     bba        5          1         4          2
2       BA2     bbc        2          1         5          5
etc.

注意: Colspan仅显示。

1 个答案:

答案 0 :(得分:0)

demo:db<>fiddle

第一种方式:FILTER

SELECT
    type,
    code,
    "desc",
    COALESCE(SUM(sales_day) FILTER (WHERE store = 101)) as sales_day_101,
    COALESCE(SUM(stock) FILTER (WHERE store = 101), 0) as stock_101,
    COALESCE(SUM(sales_day) FILTER (WHERE store = 102), 0) as sales_day_102,
    COALESCE(SUM(stock) FILTER (WHERE store = 102), 0) as stock_102
FROM mytable
GROUP BY type, code, "desc"
ORDER BY type, code

汇总您的价值观。我选择了SUM,但在您的情况下,如果行有不同的行,则许多其他聚合函数都可以做到这一点。 FILTER仅允许您汇总一个商店。

COALESCE将避免在一个聚合中不存在任何值(例如存储AA3中的102)不使用NULL值。


第二种方式,CASE WHEN

SELECT
    type,
    code,
    "desc",
    SUM(CASE WHEN store = 101 THEN sales_day ELSE 0 END) as sales_day_101,
    SUM(CASE WHEN store = 101 THEN stock ELSE 0 END) as stock_101,
    SUM(CASE WHEN store = 102 THEN sales_day ELSE 0 END) as sales_day_102,
    SUM(CASE WHEN store = 102 THEN stock ELSE 0 END) as stock_102
FROM mytable
GROUP BY type, code, "desc"
ORDER BY type, code

想法是一样的,但是更新的FILTER函数被更常见的CASE子句代替。


注意,“ desc”是Postgres中的保留字。因此,我强烈建议重命名您的列。