更正,这条SQL语句的查询结果应为:姓名:张三
班级:计算机1班
院系:13计算机系
缴费项目:学费
缴费项目年度:2012
缴费时间:2012
缴费数额:2000元
欠费数额:1000元
-------------------
姓名:张三
班级:计算机1班
院系:13计算机系
缴费项目:书本费
缴费项目年度:2012
缴费时间:无
缴费数额:无
欠费数额:500元姓名:张三
班级:计算机1班
院系:13计算机系
缴费项目:住宿费
缴费项目年度:2012
缴费时间:无
缴费数额:无
欠费数额:500元姓名:李四
班级:计算机3班
院系:12计算机系
缴费项目:学费
缴费项目年度:2012
缴费时间:2012
缴费数额:3000元
欠费数额:0元姓名:李四
班级:计算机3班
院系:12计算机系
缴费项目:书本费
缴费项目年度:2012
缴费时间:2012年
缴费数额:500元
欠费数额:0元姓名:李四
班级:计算机3班
院系:12计算机系
缴费项目:住宿费
缴费项目年度:2012
缴费时间:无
缴费数额:无
欠费数额:500元上面的查询结果中多了一个缴费项目年度,即查出已经交过费用、但是没有交齐费用的所有学生在所有学年的、各项缴费项目的欠费情况。

解决方案 »

  1.   

    你建立table和insert into的sql语句出来,然后说出你想要的结果,才好帮助 你.
      

  2.   

    由于你具体的数据和表的结构,所以大概写了一下:
    ;wiht t
    as
    (select s.学号,s.姓名,s.班级,s.院系,
           t.缴费项目,
           count(t.缴费项目) over(partition by s.学号) as jf,
           
           case when yjf.缴费时间 IS null then '无' else yjf.缴费时间 end,
           case when yjf.缴费数额 IS null then '无' else yjf.缴费数额 end,
           case when isnull(yjf.缴费数额,0) < t.缴费标准 
                     then t.缴费标准 - isnull(yjf.缴费数额,0)
                else 0
           end as 欠费数额
           
    from 学生 s 
    inner join 缴费项目 t
            on s.班级 = t.班级
               and s.院系 = t.院系
               and s.学习形式 = t.学习形式
               
    left join 已缴费学生 yjf
           on yjf.学号 = s.学号
              and yjf.缴费项目名称 = t.缴费项目名称
              and yjf.缴费时间 = t.缴费项目年度        
    )select *
    from
    (
    select *,
           count(case when 欠费数额<> 0 ) over(partition by s.学号) qf
    from t
    )tt
    where qf <> jf
      

  3.   

    楼上的非常感谢,不过你认为我这三个表的设计是否合理?我个人认为,是不是范式降低一点,3个表合并成两个表,或许SQL语句能更好写一点?
      

  4.   

    查询没有任何缴费记录的人,我是用的另外一条SQL语句,关联的是学生基本信息表和学生缴费记录表,基本思路是,只要学生基本信息表里有、缴费记录表里无的学生信息,都可以算是没有任何缴费记录。
      

  5.   


    对,首先必须有一个学生和缴费情况的笛卡尔积,然后在和缴费记录表关联,求出所有学生的应该的缴费情况和实际缴费情况,然后判断只要有一项是没交费的,那么就把这个学生选出来
    那么你认为,我能否只用缴费情况表和缴费项目标准表,就查询出有过缴费记录,但是缴费不完全的学生呢?缴费情况表通过缴费项目、(班级名称和院系名称)来同缴费项目表关联,如有可能,能否帮我写一个SQL语句?万分感谢!
      

  6.   


    对,首先必须有一个学生和缴费情况的笛卡尔积,然后在和缴费记录表关联,求出所有学生的应该的缴费情况和实际缴费情况,然后判断只要有一项是没交费的,那么就把这个学生选出来
    那么你认为,我能否只用缴费情况表和缴费项目标准表,就查询出有过缴费记录,但是缴费不完全的学生呢?缴费情况表通过缴费项目、(班级名称和院系名称)来同缴费项目表关联,如有可能,能否帮我写一个SQL语句?万分感谢!从现在的表结构来看,应该是实现不了。如果,任意一个学生,不管这个人有没有缴费,按照缴费项目表,都会自动在缴费情况表中显示缴费情况的话,那么这样是可以实现你的要求的:比如 张三,没有交过费,但是也会存在如下的记录:张三,脱产,书本费,0元
    张三,脱产,学费费,0元
    ...
      

  7.   


    对,首先必须有一个学生和缴费情况的笛卡尔积,然后在和缴费记录表关联,求出所有学生的应该的缴费情况和实际缴费情况,然后判断只要有一项是没交费的,那么就把这个学生选出来
    那么你认为,我能否只用缴费情况表和缴费项目标准表,就查询出有过缴费记录,但是缴费不完全的学生呢?缴费情况表通过缴费项目、(班级名称和院系名称)来同缴费项目表关联,如有可能,能否帮我写一个SQL语句?万分感谢!从现在的表结构来看,应该是实现不了。如果,任意一个学生,不管这个人有没有缴费,按照缴费项目表,都会自动在缴费情况表中显示缴费情况的话,那么这样是可以实现你的要求的:比如 张三,没有交过费,但是也会存在如下的记录:张三,脱产,书本费,0元
    张三,脱产,学费费,0元
    ...
    不,一分钱没交过的学生,他的资料不需要查,只需要查出有过缴费记录,但是他的缴费记录不全的人。比如缴费情况表中有一个2012年交过学费的学生,但是他2012年的书本费没交,住宿费只交了一半,那么就需要把这个学生查出来,并且查出他还欠多少费用没交,以及欠费的项目。
      

  8.   


    对,首先必须有一个学生和缴费情况的笛卡尔积,然后在和缴费记录表关联,求出所有学生的应该的缴费情况和实际缴费情况,然后判断只要有一项是没交费的,那么就把这个学生选出来
    那么你认为,我能否只用缴费情况表和缴费项目标准表,就查询出有过缴费记录,但是缴费不完全的学生呢?缴费情况表通过缴费项目、(班级名称和院系名称)来同缴费项目表关联,如有可能,能否帮我写一个SQL语句?万分感谢!从现在的表结构来看,应该是实现不了。如果,任意一个学生,不管这个人有没有缴费,按照缴费项目表,都会自动在缴费情况表中显示缴费情况的话,那么这样是可以实现你的要求的:比如 张三,没有交过费,但是也会存在如下的记录:张三,脱产,书本费,0元
    张三,脱产,学费费,0元
    ...
    不,一分钱没交过的学生,他的资料不需要查,只需要查出有过缴费记录,但是他的缴费记录不全的人。比如缴费情况表中有一个2012年交过学费的学生,但是他2012年的书本费没交,住宿费只交了一半,那么就需要把这个学生查出来,并且查出他还欠多少费用没交,以及欠费的项目。哦,那就可以写的,我加你关注了。