【问题标题】:PosrgreSQL Pivot TablePostgreSQL 数据透视表
【发布时间】:2020-12-30 13:32:43
【问题描述】:

我需要像这张表一样从 Source 制作一个 PIVOT 表

FactID  UserID  QTY Product
1         10    100   A
2         10    200   B
3         10    300   C
4         12    50    A
5         12    60    B
6         12    70    C
7         15    500   A
8         15    550   B
9         15    600   C

需要这样的枢轴

UserID  A   B   C
10     100  200 300
12     50   60  70
15     500  550 600

我的尝试

Select UserID,
       CASE WHEN product = 'A' then QTY end as A,
       CASE WHEN product = 'B' then QTY end as B,
       CASE WHEN product = 'C' then QTY end as C
from public.table

结果

UserID  A   B   C
10     100  100 100
10     200  200 200
10     300  300 300
12      50  50  50
12      60  60  60
12      70  70  70
15      500 500 500
15     550  550 550
15     600  600 600

我的错误在哪里?也许还有其他方法可以做到这一点?

【问题讨论】:

    标签: sql postgresql pivot pivot-table


    【解决方案1】:

    非常接近。你只需要聚合:

    Select UserID,
           SUM(CASE WHEN product = 'A' then QTY end) as A,
           SUM(CASE WHEN product = 'B' then QTY end) as B,
           SUM(CASE WHEN product = 'C' then QTY end) as C
    from public.table
    group by UserId;
    

    不过,在 Postgres 中,这通常会使用 FILTER 子句而不是 CASE

    Select UserID,
           SUM(qty) FILTER (WHERE product = 'A') as A,
           SUM(qty) FILTER (WHERE product = 'B') as B,
           SUM(qty) FILTER (WHERE product = 'C') as C
    from public.table
    group by UserId;
    

    【讨论】:

      【解决方案2】:

      你需要聚合函数

      Select UserID,
             Max(CASE WHEN product = 'A' then QTY end) as A,
             Max(CASE WHEN product = 'B' then QTY end) as B,
             Max(CASE WHEN product = 'C' then QTY end) as C
      from public.table
      Group by userid
      

      【讨论】:

        猜你喜欢
        • 2021-12-30
        • 1970-01-01
        • 2015-04-04
        • 1970-01-01
        • 2016-02-26
        • 2014-01-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多