Snowflake中基于LAYER列对NAME和QTY实现多列透视的方法
Snowflake同时透视数值与字符列的实现方法
你遇到的情况是Snowflake的PIVOT默认侧重数值聚合,但字符类型列可以通过聚合函数+条件逻辑实现透视,下面提供两种可行方案:
方法一:条件聚合(推荐,灵活直观)
直接用CASE WHEN结合聚合函数,针对每个LAYER分别提取QTY和NAME:
SELECT ID, MAX(CASE WHEN LAYER = 1 THEN QTY END) AS "1", MAX(CASE WHEN LAYER = 2 THEN QTY END) AS "2", MAX(CASE WHEN LAYER = 3 THEN QTY END) AS "3", MAX(CASE WHEN LAYER = 1 THEN NAME END) AS NAME_1, MAX(CASE WHEN LAYER = 2 THEN NAME END) AS NAME_2, MAX(CASE WHEN LAYER = 3 THEN NAME END) AS NAME_3 FROM your_table GROUP BY ID ORDER BY ID;
说明
因为每个ID与LAYER的组合对应唯一记录,使用MAX()(或MIN())聚合时,只会返回该组合下的唯一值,不存在聚合冲突;没有对应LAYER的记录会返回NULL,完全匹配你的输出需求。
方法二:使用PIVOT函数同时处理多列
通过构造辅助列,让PIVOT同时支持数值和字符类型的聚合:
SELECT ID, "1" AS "QTY_1", "2" AS "QTY_2", "3" AS "QTY_3", NAME_1, NAME_2, NAME_3 FROM ( SELECT ID, LAYER, QTY, NAME, CONCAT('NAME_', LAYER) AS name_pivot_col FROM your_table ) PIVOT ( MAX(QTY) FOR LAYER IN (1 AS "1", 2 AS "2", 3 AS "3"), MAX(NAME) FOR name_pivot_col IN ('NAME_1' AS NAME_1, 'NAME_2' AS NAME_2, 'NAME_3' AS NAME_3) ) AS pivot_result ORDER BY ID;
说明
这里通过CONCAT('NAME_', LAYER)构造字符列的透视标识,再用MAX(NAME)作为聚合逻辑,同样利用ID+LAYER唯一的特性,确保聚合结果正确。
内容的提问来源于stack exchange,提问作者abhi1610
相关产品推荐
相关产品推荐

