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的脚本,动态查询随表变化,结果如图:
SQL多行转多列
标签:
声明:本文来自网络,不代表【好得很程序员自学网】立场,转载请注明出处:http://haodehen.cn/did119487