固定列数的行列转换
如表结构为:
如
Name subject score --------------------------- 张三 语文 80 张三 数学 70 张三 英语 60 李四 语文 90 李四 数学 80 李四 英语 100 .... 转换为 : 语文 数学 英语 张三 80 70 60 李四 90 80 100
求:创建表,源表,表名: Stu , 只用一句sql 得到转换结果。
解答:
方法一 :通过生成临时表的方式操作
select name ,sum(yw) as '语文',sum(sx) as '数学',sum(wy) as '英语' from( select name , CASE subject WHEN '语文' THEN score END AS yw, CASE subject WHEN '数学' THEN score END AS sx, CASE subject WHEN '英语' THEN score END AS wy from Stu ) tempStu group by name
方法二:课程只有语文、数学、物理这三门课程则可以使用静态sql 来实现 Sql2000
select name as 姓名, max(case subject when '语文' then score else 0 end) 语文, max(case subject when '数学' then score else 0 end) 数学, max(case subject when '英语' then score else 0 end) 英语 from Stu group by name
方法三:如果课程不止语文、数学、物理这三门课程 则可以使用动态sql 来实现
创建一个用户变量,使用简单的T-SQL来实现。 Sql2000
declare @sql varchar(8000) --声明一个变量 set @sql = 'select name as 姓名' select @sql = @sql + ' , max(case subject when ''' + subject+ ''' then score else 0 end) [' + subject+ ']' from (select distinct subject from Stu) as a set @sql = @sql + ' from Stu group by name' print @sql --打印生成的sql exec(@sql) --执行该sql