Snowflake行转列求助:将项目WBS数据透视为指定格式
Snowflake行转列:将Project下的WBS_ID横向展开
问题场景
现有表(假设表名为project_wbs)结构及数据如下:
| Project | WBS_ID | Level |
|---|---|---|
| P.0051458 | P.0051458.01 | 2 |
| P.0051458 | P.0051458.02 | 2 |
| P.0051458 | P.0051458.03 | 2 |
| P.0051478 | P.0051478.01 | 2 |
需要转换为以下格式:
| Project | Level_01 | Level_02 | Level_03 |
|---|---|---|---|
| P.0051458 | P.0051458.01 | P.0051458.02 | P.0051458.03 |
| P.0051478 | P.0051478.01 |
解决方案
原表中Level字段值统一为2,无法直接用于透视分组,需先通过窗口函数为每个Project下的WBS_ID生成唯一序号,再使用Snowflake的PIVOT功能实现行转列。
完整SQL代码
WITH numbered_wbs AS ( SELECT Project, WBS_ID, -- 为每个Project下的WBS_ID按顺序生成序号 ROW_NUMBER() OVER (PARTITION BY Project ORDER BY WBS_ID) AS wbs_seq FROM project_wbs ) SELECT Project, "1" AS Level_01, "2" AS Level_02, "3" AS Level_03 FROM numbered_wbs PIVOT ( MAX(WBS_ID) FOR wbs_seq IN (1, 2, 3) ) AS pivot_table ORDER BY Project;
代码说明
- CTE
numbered_wbs:用ROW_NUMBER()窗口函数按Project分组,对WBS_ID排序后生成序号wbs_seq,作为后续透视的列标识。 - PIVOT操作:以
wbs_seq的取值(1、2、3)作为目标列,用MAX(WBS_ID)聚合每个序号对应的WBS_ID值(因每个序号在分组内唯一,MAX/MIN/FIRST_VALUE效果一致)。 - 列重命名:将透视后的列
"1"、"2"、"3"重命名为Level_01、Level_02、Level_03,匹配目标格式。
扩展说明
如果后续每个Project下的WBS_ID数量超过3个,只需修改PIVOT子句中的IN列表(如添加4、5),并在SELECT中对应增加"4" AS Level_04即可。
内容的提问来源于stack exchange,提问作者nick leeson
相关产品推荐
相关产品推荐

