Fina_Must表:学生通知单表
字段:
ID,StuTuitionID(学号),Grade(年级),SpeciltyID(专业代码),Year(学年) ,Term(学期)
1    1                03          11
2    1                 03         12   改专业了            06-07    1
3    2                 04          11                      06-07     1
4    3                 05           21
学生有可能改专业,所以他可能出现两个通知单。Fina_Student表:学生表
字段:
StuTuiTionID(学号),nj(年级),zydm(专业代码),
1                   03       12   
2                   04       11
3                   05       21现在我想按照 年级/专业 分组 通知单,
然后的得到每个 年级/专业 的通知单总数,
注意(如果有的学生在这个学年学期有两张通知单——改专业了,只能取一张通知单数,而且取的是这个学生最近的通知单;如果这个 年级/专业 还没有通知单页要显示这个 年级/专业 的通知单数 为零)
应该怎么写啊?
谢谢,大家!

解决方案 »

  1.   

    有几点不是很明白:
    一是如果是改专业了,那么如何得到他真正所在的专业呢?更加专业的最新的修改日期?
    第二:对于年级和专业是不是有单独的表,这个问题主要是针对没有通知单的年级和专业来说的。
    如果有单独的表 例如 Grade 表和Specilty表(id,name)估计应该好办点。
      

  2.   

    朋友们说明一下:
    分组学生 年级,专业
    直接 在学生表(Fina_Student)里获取获得的结果类似下面:
    年级  专业  收费通知单总数  
    03    11       1
    04    12       1
    05    21       1
      

  3.   

    重学生表里获得 最新专业, 当更该专业的时候,这个学生就会增加一条 收费单记录,
    因此直接获取学生的 在收费单表(Fina_Must)里去最新的行了。年级和专业 我是针对学生来的,即在校学生有这个年级/专业 我才留下。
      

  4.   

    To:mengyang(梦阳) 
    谢谢你!
      

  5.   

    如果没有改专业的话,select Grade,SpeciltyID,count(id) from Fina_Must group by Grade,SpeciltyID就行了
      

  6.   

    朋友,在Fina_Must表里面,有的  年级/专业  没有啊,
    没有的情况下 这个 年级/专业  的 通知单数 为 0
      

  7.   

    说个思路,没有考虑性能问题,假设说当改了专业后,原始专业的通知单不再纳入查询结果的话Step1: 获得每个学生每个年级最后一张通知单编号
           SELECT Max(ID) FROM 学生通知单表 group by 学号,年级Step2: 在Step1的基础上,获得每个学生最后一张通知单
           SELECT * FROM 学生通知单表 WHERE ID IN (Step1的语句)Step3: 在Step2的基础上,整理出所有某年有通知单的专业的通知单数量
           Select 专业代码,年级,Count(*) AS 数量 FROM (Step2的语句) GROUP BY 专业代码,年级
           或者可以简写为
           SELECT 专业代码,年级,Count(*) AS 数量 FROM 学生通知单表 WHERE ID IN (Step1的语句) GROUP BY 专业代码,年级==========================================================
    如果LZ希望对没有出现通知单的专业/年级 要显示出0的话,那么
    首先得知道一共有哪些专业,姑且用“专业表”来表示所有专业的信息。
    然后得知道一共查哪几个年级。例如我们现在查的是11,12,13几个年级Step4: 整理出各个专业所有年级的列表,例如
    (
    SELECT 11 AS 年级, 专业号 FROM 专业表
    UNION
    SELECT 12 AS 年级, 专业号 FROM 专业表
    UNION
    SELECT 13 AS 年级, 专业号 FROM 专业表
    )Step5: 利用子查询查出所有专业各个年级的编号单数量
    SSELECT a.专业, a.年级, 
      (SELECT Count(*) FROM (Step2的语句) b WHERE b.专业号= a.专业号 AND b.年级= a.年级) AS 数量
       FROM (Step4的语句) a
      

  8.   

    select 
    t3.nj       as nj, 
    t3.zydm     as zydm, 
    sum(counts) as newCount
    from (
    select 
    t1.StuTuiTionID, 
    t1.nj, 
    t1.zydm, 
    (selcet 
    COUNT(*)
    from 
    Fina_Must t2 
    where 
    t2.StuTuiTionID = t1.StuTuiTionID and 
    t2.Grade        = t1.nj           and
    t2.SpeciltyID   = t1.zydm         and
    t2.id = (select 
    max(fm.id) 
    from 
    Fina_Must fm 
    where 
    fm.StuTuiTionID = t2.StuTuiTionID and 
    fm.Grade        = t2.Grade        and
    fm.SpeciltyID   = t2.SpeciltyID   and
    fm.Year         = t2.Year         and
    fm.Term         = t2.Term
    )  
    and t2.Year            = &param_Year and 
    t2.Term                = &param_Term
    ) as counts 
    from 
    Fina_Student t1
    ) t3
    group by 
    t3.nj, t3.zydm
      

  9.   

    或者select 
    t3.nj    as nj, 
    t3.zydm  as zydm, 
    count(*) as newCount
    from (
    select 
    t1.StuTuiTionID, 
    t1.nj, 
    t1.zydm, 
    (selcet 
    count(*) 
    from 
    Fina_Must t2 
    where 
    t2.StuTuiTionID = t1.StuTuiTionID and 
    t2.Grade        = t1.nj and
    t2.SpeciltyID   = t1.zydm and
    Year = &param_Year and 
    Term = &param_Term
    ) as counts 
    from 
    Fina_Student t1
    ) t3
    where 
    t3.counts <> 0
    group by 
    nj, zydmunion allselect 
    t4.nj   as nj,
    t4.zydm as zydm,
    0       as newCount
    from 
    Fina_Student t4
    where
    not exists(select 

    from 
    Fina_Must t5 
    where 
    t5.Grade        = t4.nj and
    t5.SpeciltyID   = t4.zydm and
    t5.Year         = &param_Year and 
    t5.Term         = &param_Term
    )
    group by 
    nj,zydm,
      

  10.   

    如果支持decode的话还可以简化为select 
    t3.nj       as nj, 
    t3.zydm     as zydm, 
    sum(counts) as newCount
    from (
    select 
    t1.StuTuiTionID, 
    t1.nj, 
    t1.zydm, 
    (selcet 
    decode(COUNT(*),0,0,1)  --//此时COUNT(*)只有1和0
    from 
    Fina_Must t2 
    where 
    t2.StuTuiTionID = t1.StuTuiTionID and 
    t2.Grade        = t1.nj           and
    t2.SpeciltyID   = t1.zydm         and
    t2.Year         = &param_Year and 
    t2.Term         = &param_Term
    ) as counts 
    from 
    Fina_Student t1   
    ) t3
    group by 
    t3.nj, t3.zydm说一下以上SQL的思路以Fina_Student为基表进行逐条遍历,并为其增加一个列counts ,如果在Fina_Must表中能找到符合条件(参考WHERE部分)的通知单纪录则记counts为1(说明该学生这个学年学期有通知单),否则记counts为0(没有通知单),最后把查出的结果集按年级和专业进行分组,同时累计出同年级同专业上的各个counts通知单个数总和,输出结果为newCount。使用union all的那个应该好理解一些,不说明了