代码如下
create table StuInfo
(D_Id int identity(1,1), D_StuInfoId varchar(10), D_Name varchar(10), D_ClassInfoId int)
insert StuInfo  
select '20090101', '小李', 1 union all
select '20090102', '小王' ,1 union all
select '20090103', '小张', 1
--课程表
create table CourseInfo
(D_Id int identity(1,1), D_Name varchar(10))
insert CourseInfo
select '语文' union all
select '数学' union all
select '英语'--成绩表
create table 成绩表
(D_Id int identity(1,1), D_StuInfoId int, D_CourseInfoId int,D_Mark int)
insert 成绩表
select 1, 1 ,100 union all
select 1 ,2 ,99 union all
select 2 ,1 ,78 union all
select 2 ,3 ,60select s.D_Id as 学号 ,
  max(case c.D_Name when '语文' then j.D_Mark else 0 end) 语文,
  max(case c.D_Name when '数学' then j.D_Mark else 0 end) 数学,
  max(case c.D_Name when '英语' then j.D_Mark else 0 end) 英语
from CourseInfo c left join 成绩表 j on c.D_Id=j.D_CourseInfoId right join StuInfo s on s.D_Id=j.D_StuInfoId
group by s.D_Id  为啥需要max函数,case.. then ..end  当c.d_name 为'语文' 时,显示 j.d_ 列,为什么就可以取到语文的成绩,搞不懂。
请高手来解释下。

解决方案 »

  1.   

    先理解这句吧。case c.D_Name when '语文' then j.D_Mark else 0 end
      

  2.   


    你先看下下面语句的是结果就会明白了
    select s.D_Id as 学号 ,
      case c.D_Name when '语文' then j.D_Mark else 0 end 语文,
      case c.D_Name when '数学' then j.D_Mark else 0 end 数学,
      case c.D_Name when '英语' then j.D_Mark else 0 end 英语
    from CourseInfo c left join 成绩表 j on c.D_Id=j.D_CourseInfoId right join StuInfo s on s.D_Id=j.D_StuInfoId
      

  3.   

      你还不是可以用其他的聚合函数,min
      

  4.   

    随便 用 max  min sum  avg 只要是聚合函数 都可以,只是合并下。MAX不代表什么
      

  5.   

    min,avg这两个真的可以吗?
      

  6.   


    这样也可以:select s.D_Id as 学号 ,
      min(case c.D_Name when '语文' then j.D_Mark else 100 end) 语文,
      min(case c.D_Name when '数学' then j.D_Mark else 100 end) 数学,
      min(case c.D_Name when '英语' then j.D_Mark else 100 end) 英语
    from CourseInfo c left join 成绩表 j on c.D_Id=j.D_CourseInfoId right join StuInfo s on s.D_Id=j.D_StuInfoId
    group by s.D_Id