码迷,mamicode.com
首页 > 数据库 > 详细

SQL多行转多列

时间:2015-05-18 22:29:06      阅读:211      评论:0      收藏:0      [点我收藏+]

标签:

技术分享

--★转换结果如上图

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

技术分享

 

SQL多行转多列

标签:

原文地址:http://www.cnblogs.com/tianguook/p/4512975.html

踩
(0)
赞
(0)
   
举报
评论 一句话评论(0)
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!