SQL执行PIVOT行转列查询报错 如何获取预期结果
问题排查
你描述是做UNPIVOT逆透视,但给出的代码实际是PIVOT行转列逻辑,查询报错的核心原因如下:
- 语法书写错误:PIVOT的IN子句中
[Group[右方括号缺失,正确写法为[Group];同时Group是SQL保留关键字,查询字段列表中引用时必须加方括号包裹 - 缺失必填聚合函数:PIVOT语法要求必须对值字段
State_NM使用聚合函数,直接写字段名不符合语法规范 - 排序字段不存在:
ORDER BY Tab2.Name引用的Name字段在PIVOT输出的结果集中不存在,结果集仅包含ID和你指定的三个分组列 - 数据一致性问题:测试数据最后一条的GroupType值为
Jobtitle(首字母大写t小写),和其他行的JobTitle大小写不一致,默认排序规则下会被识别为两个不同分组,导致行转列遗漏值 - 逻辑兼容问题:部分ID下同个GroupType对应多个State_NM值(比如ID=100的JobTitle对应TX、NC两个值),直接用普通聚合只会返回单个值,需要按需选择聚合逻辑。
修正代码
基础版本(同组多值取单值,用MAX聚合)
适配大多数场景,同个ID下同个GroupType仅返回一个匹配值:
SELECT ID, Facility, [Group], JobTitle FROM (SELECT ID, GroupType, State_NM FROM #test )Tab1 PIVOT ( MAX(State_NM) FOR GroupType IN ([Facility],[Group],[JobTitle]) ) AS Tab2 ORDER BY Tab2.ID
多值拼接版本(兼容同组多值场景)
如果需要把同个ID下同个GroupType的多个State_NM用逗号拼接展示,使用CASE WHEN加聚合的方式实现更灵活:
SELECT ID, MAX(CASE WHEN GroupType = 'Facility' THEN State_NM END) AS Facility, MAX(CASE WHEN GroupType = 'Group' THEN State_NM END) AS [Group], STRING_AGG(CASE WHEN GroupType IN ('JobTitle','Jobtitle') THEN State_NM END, ',') AS JobTitle FROM #test GROUP BY ID ORDER BY ID
如果你使用SQL Server 2016及更早版本,不支持
STRING_AGG函数,可以替换为FOR XML PATH的方式实现多字符串拼接。
内容的提问来源于stack exchange,提问作者anonymous
相关产品推荐
相关产品推荐

