写这篇文章的时候参考了《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 去掉,从结果来看您就明白了