SQL行转列实现:按KlientId合并问卷评估数据生成宽表
SQL行转列实现问卷评估结果宽表输出
需求背景
- 现有5表逐级关联查询返回长表格式结果:
Client、Person、Process、AssessmentDF、CriteriaDF通过外键关联,筛选条件为评估名称匹配RightAssessmentName、评估日期在近180天内 - 长表字段包含客户ID、姓氏、名字、生日、指标名称(
CriteriaName)、指标结果(Result),同一客户的不同评估指标分多行存储 - 目标输出宽表格式:将固定取值为
IF1~IF19的指标名称转为独立列,同一客户的所有指标结果合并为单行,对应列填充匹配的指标结果值
实现代码(适配SQL Server环境,与现有语法兼容)
SELECT Id, Name1, Name2, Birthday, IF1, IF2, IF3, IF4, IF5, IF6, IF7, IF8, IF9, IF10, IF11, IF12, IF13, IF14, IF15, IF16, IF17, IF18, IF19 FROM ( -- 原有优化后的多表关联查询作为数据源 SELECT t1.Id, t2.Name1, t2.Name2, t2.Birthday, t5.CriteriaName, t5.Result FROM Client AS t1 INNER JOIN Person AS t2 ON t1.PersonId = t2.Id INNER JOIN Process AS t3 ON t1.Id = t3.ClientId INNER JOIN AssessmentDF AS t4 ON t3.Id = t4.ProcessId INNER JOIN CriteriaDF AS t5 ON t4.Id = t5.AssessmentDfId WHERE t4.Bezeichnung = 'RightAssessmentName' AND t4.Date > DATEADD(day, -180, GETDATE()) ) AS SourceData PIVOT ( -- 单客户单指标仅对应一个结果,MAX/MIN聚合均可正确取值 MAX(Result) FOR CriteriaName IN ( IF1, IF2, IF3, IF4, IF5, IF6, IF7, IF8, IF9, IF10, IF11, IF12, IF13, IF14, IF15, IF16, IF17, IF18, IF19 ) ) AS PivotResult
注意事项
- 由于业务中
CriteriaName取值固定为IF1至IF19,无需使用动态SQL拼接列,该写法执行效率更高、可维护性更强 - 若某客户缺失对应指标的答题结果,对应列默认返回
NULL,可通过ISNULL(IF1, '未填写') AS IF1的写法自定义空值展示内容 - 后续若新增评估指标,只需同步在外层SELECT字段列表、PIVOT的IN指标列表中添加对应指标名即可
内容的提问来源于stack exchange,提问作者Jartyyy
相关产品推荐
相关产品推荐

