SQL Server中PIVOT未按预期工作:每行仅返回一个透视值
PIVOT查询未按预期聚合问题
数据模拟样例
| ID | 行号 | 属性 | 文本内容 |
|---|---|---|---|
| 600 | 1 | Name | Tom |
| 600 | 1 | Age | 32 |
| 600 | 1 | Type | Secondary |
| 600 | 2 | Name | Joanne |
| 600 | 2 | Age | 36 |
| 600 | 2 | Type | Primary |
| 601 | 1 | Name | Bob |
| 601 | 1 | Age | 16 |
| 601 | 1 | Type | Primary |
| 601 | 2 | Name | Alex |
| 601 | 2 | Age | 99 |
| 601 | 2 | Type | Secondary |
期望结果
| ID | 行号 | Name | Age | Type |
|---|---|---|---|---|
| 600 | 1 | Tom | 32 | Secondary |
| 600 | 2 | Joanne | 36 | Primary |
| 601 | 1 | Bob | 16 | Primary |
| 601 | 2 | Alex | 99 | Secondary |
当前查询语句
SELECT [ID], [Row], [Name], Age, [Type] FROM my_data_source PIVOT (max(Textcontent) FOR Attribute in ( [Name], Age, [Type] )) as p order by ID, [Row]
实际返回结果
| ID | 行号 | Name | Age | Type |
|---|---|---|---|---|
| 600 | 1 | Tom | NULL | NULL |
| 600 | 1 | NULL | 32 | NULL |
| 600 | 1 | NULL | NULL | Secondary |
| 600 | 2 | Joanne | NULL | NULL |
| 600 | 2 | NULL | 36 | NULL |
| 600 | 2 | NULL | NULL | Primary |
| ... | ... | ... | ... | ... |
版本信息
| 组件名称 | 版本 |
|---|---|
| SQL Server Management Studio | 15.0.18424.0 |
| SQL Server Management Objects (SMO) | 16.100.47021.0 |
| Microsoft Analysis Services Client Tools | 15.0.19750.0 |
| Microsoft Data Access Components (MDAC) | 10.0.19041.5486 |
| Microsoft MSXML | 3.0 6.0 |
| Microsoft .NET Framework | 4.0.30319.42000 |
| 操作系统 | 10.0.19045 |
问题原因及解决方案
问题出在直接对my_data_source进行PIVOT时,该数据源可能包含额外的唯一标识列(如自增ID、主键列),这些列会被SQL Server的PIVOT逻辑当作分组键,导致原始表中的每一行单独成为一个分组,最终转置后每个行只有对应属性的列有值,其余为NULL。
同时原查询中的[Row]与实际表列名“行号”不匹配,也会干扰分组逻辑。
修正后的查询语句:
SELECT [ID], [行号], [Name], [Age], [Type] FROM ( -- 仅筛选PIVOT所需的必要列,排除无关唯一标识列 SELECT ID, [行号], Attribute, Textcontent FROM my_data_source ) AS src PIVOT ( MAX(Textcontent) FOR Attribute IN ([Name], [Age], [Type]) ) AS p ORDER BY ID, [行号]
内容的提问来源于stack exchange,提问作者user91
相关产品推荐
相关产品推荐

