日期:2014-05-17  浏览次数:20468 次

普通行列转换
问题:假设有张学生成绩表(tb)如下: 
姓名 课程 分数 
张三 语文 74 
张三 数学 83 
张三 物理 93 
李四 语文 74 
李四 数学 84 
李四 物理 94 
想变成(得到如下结果):  
姓名 语文 数学 物理  
---- ---- ---- ---- 
李四 74   84   94 
张三 74   83   93 
------------------- 
*/
  
create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int) 
insert into tb values('张三' , '语文' , 74) 
insert into tb values('张三' , '数学' , 83) 
insert into tb values('张三' , '物理' , 93) 
insert into tb values('李四' , '语文' , 74) 
insert into tb values('李四' , '数学' , 84) 
insert into tb values('李四' , '物理' , 94) 
go 
  
--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同) 
select 姓名 as 姓名 , 
  max(case 课程 when '语文' then 分数 else 0 end) 语文, 
  max(case 课程 when '数学' then 分数 else 0 end) 数学, 
  max(case 课程 when '物理' then 分数 else 0 end) 物理 
from tb 
group by 姓名 

为什么SQL语句使用max 
max(case 课程 when '语文' then 分数 else 0 end) 语文, 
------解决方案--------------------
就是个聚合函数嘛,没其他的.
------解决方案--------------------
因为group 分组后,需要对不在分组列中的查询列用聚合函数. 用sum 也行。
------解决方案--------------------
其实你可以先不使用,然后看看结果,你会看到有两行记录,为了使其合成一样,就要使用某些聚合函数,而这里max比较合适,所以就用max了。