1. 介绍说明
前段时间组内的小伙伴在升级维护项目中,经常涉及一些复杂的数据转换问题,让我去看下有些地方怎么处理,我发现好多都是涉及到行列转换的问题,处理起来经常会比较麻烦,借此也总结一下,方便以后的查阅使用。该总结参照了网上的一些资料,也做了一些变动,如有更好的方法也欢迎指出。
演示的脚本见 3.测试数据脚本
2. 例子演示
2.1 实现行转列
(1) Case WHEN 实现行转列
/*-----1.1 Case WHEN 实现行转列----------*/ --(1)静态SQL SELECT [姓名], max(CASE 课程 WHEN '语文' THEN 分数 ELSE 0 end) AS 语文, max(CASE 课程 WHEN '数学' THEN 分数 ELSE 0 end)AS 数学, max(CASE 课程 WHEN '物理' THEN 分数 ELSE 0 end)AS 物理, SUM(分数) AS 总分, AVG(分数) AS 平均分 FROM tbScore GROUP BY [姓名] --(2)动态SQL DECLARE @sql VARCHAR(500) SET @sql = 'SELECT [姓名]' SELECT @sql = @sql + ',MAX(CASE [课程] WHEN ''' + [课程] + ''' THEN [分数] ELSE 0 END)[' + [课程] + ']' FROM ( SELECT DISTINCT [课程] FROM tbScore ) T1 --同FROM tbScore GROUP BY [课程],默认按课程名排序 SET @sql = @sql + ' FROM tbScore GROUP BY [姓名]' PRINT '@sql: ' + @sql EXEC(@sql)