select subject_name "专业名称",
       sum(decode(grade,2002,1,0)) "2002级学生总人数",
       sum(decode(grade,2003,1,0)) "2003级学生总人数",
       sum(decode(grade,2004,1,0)) "2004级学生总人数",
       sum(decode(grade,2005,1,0)) "2005级学生总人数"
from 专业表 a,学生表 b
where a.subject_id = b.subject_id
group by a.subject_name

解决方案 »

  1.   

    select 专业表.专业,T1.scount1 as 2002级学生总人数,T2.scount2 as 2003级学生总人数,
             T3.scount3 as 2004级学生总人数,T4.scount4 as 2005级学生总人数
    from 专业表
    left join (select 专业,count(1) as scount1 from 学生表 where 年级=2002 group by 专业) T1
       on 专业表.专业  = T1.专业
    left join (select 专业,count(1) as scount2 from 学生表 where 年级=2003 group by 专业) T2
       on 专业表.专业  = T2.专业
    left join (select 专业,count(1) as scount3 from 学生表 where 年级=2004 group by 专业) T3
       on 专业表.专业  = T3.专业
    left join (select 专业,count(1) as scount4 from 学生表 where 年级=2005 group by 专业) T4
       on 专业表.专业  = T4.专业
      

  2.   

    decode函数没起作用,最后算出的结果是每个专业的学生总数,各个年级未分开。这是为什么呢
      

  3.   

    decode函数没起作用,最后算出的结果是每个专业的学生总数,各个年级未分开。这是为什么呢
    ----------------------怎么可能呢,你把你写的SQL贴出来看看,肯定什么地方有遗漏的
      

  4.   

    呵呵,是我的错,把sum写成count了。
    现在还有一个问题,这样的查询结果只能显示四个年级中招生的专业。
    对于学校有的专业,而所有年级都未招生的专业该怎么现在在我的查询结果里?
      

  5.   

    用动态SQL,
    年级不固定的话,列数都是不确定的
      

  6.   

    hevin(没有什么是不可能的):
    如果是动态的sql怎么写?正要问这个问题呢,呵呵。duanzilin(寻)
    因为在专业表和学生表中做了连接,也就是说如果学生表中没有的专业而专业表中有的专业,是不会这这个查询的结果显示出来的。所以说如果所有年级都未招生的专业就不会出现在这个查询的查询结果中。
      

  7.   

    也就是说如果学生表中没有的专业而专业表中有的专业,是不会这这个查询的结果显示出来的
    -------------------------
    你可以试试用外连接啊,这样学生表里没有的专业也会统计出来,不过各年级人数都是0,还有你要统计的是在校的学生吧,不可能把已经毕业的也统计进去吧,那样也不会有很多不确定的年级吧select subject_name "专业名称",
           sum(decode(grade,2002,1,0)) "2002级学生总人数",
           sum(decode(grade,2003,1,0)) "2003级学生总人数",
           sum(decode(grade,2004,1,0)) "2004级学生总人数",
           sum(decode(grade,2005,1,0)) "2005级学生总人数"
    from 专业表 a,学生表 b
    where a.subject_id (+) = b.subject_id
    group by a.subject_name
      

  8.   

    要统计各年级男女生就要嵌套decode(),或者用case when
    例如:
    sum(decode(grade,2002,decode(sex,'男',1,0),0)) "2002级学生男生人数",
    sum(decode(grade,2002,decode(sex,'女',1,0),0)) "2002级学生女生人数",
    或者用case when
    case when grade = 2002 and sex = '男' then 1 else 0 end "2002级学生男生人数",
    case when grade = 2002 and sex = '女' then 1 else 0 end "2002级学生女生人数",
      

  9.   

    多谢duanzilin(寻) 的帮助
    最后一个问题
      如果现在要统计各专业的班级数呢?而且数据来源于学生基本信息里,decode能实现么?
      

  10.   

    统计班级数,在原有语句里加上统计列 count(distinct class) "班级数" 再试试