现在的位置: 首页 > 综合 > 正文

sql 将行显示为列

2012年01月18日 ⁄ 综合 ⁄ 共 1243字 ⁄ 字号 评论关闭

写这篇文章的时候参考了《sql hacks》这部书,用的是sql server 2008

比如说,有一个表

create table  tbCourseGrade
(
	student varchar(10)  , 
	course varchar(10)  , 
	grade int 
)

然后有一些记录:

insert into  tbCourseGrade (student ,  course  ,  grade )
values ('小明' ,  '高数'  , 98 ),
('小明' ,  '英语'  , 56 )  , 
('小明' ,  '语文'  , 77 )  ,
('小红' ,  '高数'  , 89 ), 
('小红' ,  '英语'  , 88 ) ,
('小明' ,  '语文'  , 67 )

insert into tbCourseGrade(student , course , grade )
values ('小米'  , '高数' ,55)

那么显示出来应该是:

student   course   grade

小明         高数        98

小明        英语         56

*****

小红      高数           89

*****

小米      高数           55

那怎么才能显示为

名字      高数     英语    语文

小明      98        56      77

小红  ******

小米     55       null      null

这是一个很经常遇到的问题:将行显示为列  !!!

下面提供两种方法:

1,自己连接自己四次

select  yuan.student as 姓名 ,
gaoshu.grade as 高数 , 
yingyu.grade as 英语 , 
yuwen.grade as 语文
from tbCourseGrade as yuan
left join tbCourseGrade as  gaoshu 
on (yuan.student = gaoshu.student and gaoshu.course='高数')
left join tbCourseGrade as yingyu
on (yuan.student = yingyu.student and yingyu.course='英语' )
left join tbCourseGrade  as yuwen
on (yuan.student = yuwen.student and yuwen.course='语文')

2,用case语句

select yuan.student as 姓名 , 
max (case when hou.course='高数'
	then hou.grade
	else null
	end ) as 高数成绩 ,
max (case when hou.course='英语'
	then hou.grade
	else null
	end ) as 英语成绩  ,
max (case when hou.course='语文'
	then hou.grade 
	else null
	end) as  语文成绩
from tbCourseGrade as  yuan  
join tbCourseGrade as hou  on yuan.student= hou.student
group  by yuan.student

可能您在看以上两种方法的时候,会觉得为什么要用 left join  和max  ,如果不明白,可以将 left  和 max 去掉,从结果来看您就明白了

抱歉!评论已关闭.