You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Snowflake行转列求助:将项目WBS数据透视为指定格式

Snowflake行转列:将Project下的WBS_ID横向展开

问题场景

现有表(假设表名为project_wbs)结构及数据如下:

ProjectWBS_IDLevel
P.0051458P.0051458.012
P.0051458P.0051458.022
P.0051458P.0051458.032
P.0051478P.0051478.012

需要转换为以下格式:

ProjectLevel_01Level_02Level_03
P.0051458P.0051458.01P.0051458.02P.0051458.03
P.0051478P.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;

代码说明

  1. CTE numbered_wbs:用ROW_NUMBER()窗口函数按Project分组,对WBS_ID排序后生成序号wbs_seq,作为后续透视的列标识。
  2. PIVOT操作:以wbs_seq的取值(1、2、3)作为目标列,用MAX(WBS_ID)聚合每个序号对应的WBS_ID值(因每个序号在分组内唯一,MAX/MIN/FIRST_VALUE效果一致)。
  3. 列重命名:将透视后的列"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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.23 09:22:12