无需SUM/MAX聚合的SQL PIVOT数据转置方法求助
解决SQL PIVOT聚合导致的非预期转置问题
你的问题核心是缺少分组标识,直接用PIVOT会把同一Code下的所有值聚合,而你需要的是按每个Code的行顺序对应转置。解决方法是先给每个Code的行添加行号,让PIVOT能按行号匹配对应位置的值。
修正后的查询语句
SELECT A, B, C FROM ( SELECT Code, ColVal, -- 给每个Code的行按ColVal排序生成唯一行号 ROW_NUMBER() OVER (PARTITION BY Code ORDER BY ColVal) AS RowNum FROM YourTable -- 替换成你的实际表名 ) TBL PIVOT ( MAX(ColVal) -- 这里用MAX或SUM均可,同一RowNum下每个Code仅对应一个值,不会产生聚合合并 FOR Code IN (A, B, C) ) AS pvt
原理说明
- 用
ROW_NUMBER() OVER (PARTITION BY Code ORDER BY ColVal)给每个Code分组内的行生成序号,让每个Code的第1行、第2行等都有对应的唯一标识。 - PIVOT会自动以
RowNum作为分组依据,每个RowNum下每个Code最多只有一个值,因此使用MAX/SUM只会取出对应位置的数值,无值的位置自动显示NULL,完全匹配你的预期输出。
执行结果
运行上述语句后,输出将与预期一致:
A B C 1 1 1 2 2 2 3 3 NULL NULL 4 NULL
内容的提问来源于stack exchange,提问作者Naveen Kumar
相关产品推荐
相关产品推荐

