SQL Server 2016如何合并Pivot结果中Chair与Co-Chair为同一列
解决方案
你需要的是对两个数值字段求和合并,而非字符串拼接,所以无需使用concat函数,直接对两列数值相加即可,同时修正原SQL的语法问题后方案如下:
测试表创建代码
CREATE TABLE #temp2 ( University varchar(255), ChairRole varchar(255) ); INSERT INTO #temp2 (University ,ChairRole) VALUES ('Test 1','Chair') INSERT INTO #temp2 (University ,ChairRole) VALUES ('Test 2','Chair') INSERT INTO #temp2 (University ,ChairRole) VALUES ('Test 3','Vice-Chair') INSERT INTO #temp2 (University ,ChairRole) VALUES ('Test 4','Co-Chair')
修正后的查询SQL
按大学拆分统计版本
SELECT University, Chair = ISNULL([Chair], 0) + ISNULL([Co-Chair], 0), [Vice-Chair] = ISNULL([Vice-Chair], 0) FROM #temp2 PIVOT ( COUNT(*) FOR [ChairRole] IN ([Chair],[Vice-Chair],[Co-Chair]) ) AS p WHERE University IS NOT NULL ORDER BY [Vice-Chair] DESC FOR XML PATH('University'), TYPE FOR XML PATH('Report')
全局汇总版本(符合你给出的期望输出结构)
SELECT SUM(ISNULL([Chair], 0) + ISNULL([Co-Chair], 0)) AS Chair, SUM(ISNULL([Vice-Chair], 0)) AS [Vice-Chair] FROM #temp2 PIVOT ( COUNT(*) FOR [ChairRole] IN ([Chair],[Vice-Chair],[Co-Chair]) ) AS p FOR XML PATH('University'), TYPE FOR XML PATH('Report')
核心改动说明
- Chair列直接计算为
ISNULL([Chair], 0) + ISNULL([Co-Chair], 0),合并两个角色的统计数值 - 移除SELECT语句中的
[Co-Chair]字段,最终XML输出不会包含该节点 - 修正PIVOT中的聚合函数:原语句
SUM(Total)引用了不存在的Total字段,替换为COUNT(*)实现按角色统计数量 - 移除原语句多余的右括号,修复语法错误
输出结果
全局汇总版本执行后得到的XML符合预期格式:
<Report> <University> <Chair>3</Chair> <Vice-Chair>1</Vice-Chair> </University> </Report>
数值差异为你给出的示例测试数据和实际业务数据差异导致,合并逻辑保持通用即可。
内容的提问来源于stack exchange,提问作者Jefferson
相关产品推荐
相关产品推荐

