如何实现带重复行的多行数据PIVOT转换?求解决方案
解决带重复数据的多行PIVOT转换问题
你的常规PIVOT只返回一行,核心原因是没有给每个line_type下的重复条目分配唯一的组内序号,MAX(line_name)会把同一类型的所有值聚合为单个结果。要实现你要的多行列结构,必须先给每个类型的记录添加行号,再进行PIVOT操作。
解决方案代码
SELECT [Internal], [Makloon], [Process] FROM ( SELECT [line_type], [line_name], -- 给每个line_type分组内的记录分配行号,作为PIVOT的分组依据 ROW_NUMBER() OVER (PARTITION BY [line_type] ORDER BY (SELECT NULL)) AS row_num FROM [table_name] ) pvt PIVOT ( MAX(line_name) FOR [line_type] IN ( [Internal], [Makloon], [Process] ) ) AS pvt_table;
代码说明
- 添加组内行号:使用
ROW_NUMBER() OVER (PARTITION BY [line_type] ORDER BY (SELECT NULL)),给每个line_type分组内的记录生成递增序号。这样同一类型的重复条目会拥有不同的行号,确保PIVOT时不会被聚合为一行。- 如果你的数据有实际的排序逻辑(比如插入时间、主键ID),可以把
(SELECT NULL)替换为对应的排序字段,保证结果行的顺序符合业务预期。
- 如果你的数据有实际的排序逻辑(比如插入时间、主键ID),可以把
- PIVOT分组逻辑:此时PIVOT会自动按
row_num分组,每个行号对应结果中的一行,不同line_type的对应值会填充到各自列中,没有匹配值的位置会显示为NULL(对应你期望结果中的空单元格)。
执行结果
运行上述代码后,会得到与你预期一致的结果:
| Internal | Makloon | Process |
|---|---|---|
| Storage 1 | Storage 2 | Storage B |
| Storage 1 | Storage 3 | NULL |
| NULL | Storage 3 | NULL |
(注:SQL中NULL在表格显示时通常会呈现为空单元格,与你的预期格式完全匹配)
内容的提问来源于stack exchange,提问作者lolster
相关产品推荐
相关产品推荐

