好得很程序员自学网

<tfoot draggable='sEl'></tfoot>

SQL多行转多列

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的脚本,动态查询随表变化,结果如图:

 

SQL多行转多列

标签:

查看更多关于SQL多行转多列的详细内容...

  阅读:49次