--★转换结果如上图
1、首先创建表:
CREATE TABLE [成绩表]( [编号] [int]IDENTITY(1,1) NOT NULL, [姓名] [varchar](50)NULL, [语文] [numeric](5, 2)NULL, [数学] [numeric](5, 2)NULL, [英语] [numeric](5, 2)NULL ) ON [PRIMARY]
2、插入测试数据
INSERT INTO 成绩表([姓名],[语文],[数学],[英语]) VALUES('道一',80,100,90.8),('老二',48,56,60),('张三',88,78,90),('李四',80,90,95),('王五',67,68,56),('刘六',77,68,80)
3、执行语句进行行列转换
declare @sql_1 varchar(8000) select @sql_1='' select @sql_1= @sql_1 + 'select [编号],[姓名],['+name+'] AS ''成绩'','''+name+''' AS ''课程'' from 成绩表 union all ' from syscolumns where id=object_id('成绩表') and CHARINDEX(name,'编号,姓名')=0 select @sql_1= @sql_1 + ' select distinct null,null,null,null from 成绩表 ' --注意!多一行 selectdistinct null,null,null,null from 成绩表 不加会报union all错误 print @sql_1 declare @sql_2 varchar(8000) select @sql_2='select [课程] ' select @sql_2=@sql_2 + ',SUM(case when [姓名] = '''+[姓名]+''' then 成绩 else 0 end) '''+[姓名]+''' ' from 成绩表 select @sql_2=@sql_2 + ' from ( '+@sql_1 +') as tb where ISNULL([编号],'''')<>'''' group by [课程]' print @sql_2 execute(@sql_2)
执行行列转换后的结果如图:
4、继续添加一些数据
INSERT INTO 成绩表([姓名],[语文],[数学],[英语]) VALUES('鬼七',67,68,56),('王八',77,68,80)
5、继续执行步骤3的脚本,动态查询随表变化,结果如图: