为group by中的每个组创建列

ee7vknir  于 2021-07-29  发布在  Java
关注(0)|答案(2)|浏览(285)

假设我有一张table T 其条目如下:

id   | type   | value   | 
-------------------------
1    | A      | 7
1    | B      | 8
2    | A      | 9
2    | B      | 10
3    | A      | 11
3    | B      | 12
1    | C      | 13
2    | C      | 14

对于每种类型,我需要一个不同的列。由于类型的数量是详尽的,我希望所有不同的类型被枚举,并为每个相应的列。我想做点什么 id 表的主键。
所以,期望的输出是这样的:

id   | A's value | B's value | C's value
------------------------------------------
1    | 7         | 8         | 13
2    | 9         | 10        | 14
3    | 11        | 12        | NULL

请注意,这是一个简化版本。实际表格 T 是从一个更大的表中派生出来的 group by . 对于每个小组,我想要一个单独的专栏。这有可能吗?

alen0pnh

alen0pnh1#

使用条件聚合:

select id,
       max(case when type = 'A' then value end) as a_value,
       max(case when type = 'B' then value end) as b_value,
       max(case when type = 'C' then value end) as c_value
from t
group by id;
x7rlezfr

x7rlezfr2#

我建议查看pivot函数:
https://docs.snowflake.com/en/sql-reference/constructs/pivot.html
不过,这个函数的主要障碍是pivot\u列的值列表需要预先确定。为此,我通常使用listag函数:
https://docs.snowflake.com/en/sql-reference/functions/listagg.html
我在下面提供了一个查询,向您展示了如何构建该字符串,在类似python的脚本中甚至在存储过程中一起实现这一点应该相当简单(构建pivot\u列、构建aggregate/pivot命令、执行aggregate/pivot命令)。
我希望这有助于…rich

CREATE OR REPLACE TABLE monthly_sales(
    empid   INT, 
    amount  INT, 
    month   TEXT)
AS SELECT * FROM VALUES
    (1, 10000, 'JAN'),
    (1, 400, 'JAN'),
    (2, 4500, 'JAN'),
    (2, 35000, 'JAN'),
    (1, 5000, 'FEB'),
    (1, 3000, 'FEB'),
    (2, 200, 'FEB'),
    (2, 90500, 'FEB'),
    (1, 6000, 'MAR'),
    (1, 5000, 'MAR'),
    (2, 2500, 'MAR'),
    (2, 9500, 'MAR'),
    (1, 8000, 'APR'),
    (1, 10000, 'APR'),
    (2, 800, 'APR'),
    (2, 4500, 'APR');

SELECT * 
FROM monthly_sales
    PIVOT(SUM(amount) 
    FOR month IN ('JAN', 'FEB', 'MAR', 'APR'))
    AS p
ORDER BY empid;

SELECT LISTAGG( DISTINCT  ''''||month||'''',  ', ' ) 
FROM monthly_sales;

相关问题