两张表:1.应收费用(yingshou)编号 月份  本月应收 当前余额
1001   4    100       0
1001   5    200       0
1002   4    350       -300
1002   5    300       -300 
1003   4    250       50
1003   5    650       50
2.已收费用(yishou)编号 月份  本月已收 1001   4    100 
1001   5    200
1002   4    350   
1003   4    950  (多交的为预交)
我想在一个grid按如下格式查询出某月(如4月)交费情况,和欠费情况,,不知道应该怎么写这条SQL语句?
格式为(按如上所给出的数据):5月份交费情况:编号    本月应收  本月已收  当前余额
1001      200      200        0
1003      650      0         50 (这里是关键,因为1003在yingshou的5月份数据中有记录。而yishou中无5月份的记录,怎样才能对应起来呢)5月份欠费情况:编号    本月应收  本月已收  当前余额
1002      300      Null       -300(这里是关键,因为1002在yingshou的5月份数据中有记录。而yishou中无5月份的记录,怎样才能对应起来呢)谢谢各位朋友如能帮我,,100分全给他,绝不食言。并且请各位注意(yingshou)表有而(yishou)中没有的情况,用外连接。。

解决方案 »

  1.   

    select 编号,月份,本月应收,本月已收,(本月应收-本月已收+当前余额) from yingshou left join yishou on yingshou.编号=yishou.编号 and yigshou.月份=yishou.月份具体自己改一下
      

  2.   

    你可以试试 Union 查询
      一部分是 编号 和月份符合 的查询结果
      另一部分是 编号相同但月份不相同 or 编号 月份都不符合 的查询结果
      

  3.   

    请加入SUM对你要统计的字段进行统计就可以了..
    如:select SUM(thefield) from XXXX
      

  4.   

    SELECT SUM(ISNULL(dbo.yishou.Money, 0)) AS MonthFee, dbo.yinshou.ItemNO, 
          dbo.yinshou.ItemMonth, dbo.yinshou.Fee, 
          dbo.yinshou.Remain + dbo.yinshou.Fee - SUM(ISNULL(dbo.yishou.Money, 0)) 
          AS remain
    FROM dbo.yinshou LEFT OUTER JOIN
          dbo.yishou ON dbo.yinshou.ItemNO = dbo.yishou.ItemNO AND 
          dbo.yinshou.ItemMonth = dbo.yishou.ItemMonth
    GROUP BY dbo.yinshou.ItemNO, dbo.yinshou.ItemMonth, dbo.yinshou.Fee, 
          dbo.yinshou.Remainitemno:编号       itemmonth:月份          fee: 本月应收       remain: 当前余额
    money:本月已收
      

  5.   

    1.交费情况:select a.编号,a.月份 ,a.本月应收,本月已收=(case when 
    ((select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份) is null) then 0 else (select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份) end)  , a.当前余额
    from yingshou a
    where a.当前余额>=02.欠费情况:select a.编号,a.月份 ,a.本月应收,本月已收=(case when 
    ((select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份) is null) then 0 else (select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份) end)  , a.当前余额
    from yingshou a
    where a.当前余额<0
      

  6.   

    谢谢。。问题在另一个账号里的解用过。我这是重新把问题整理了一下才又问的采用系统是delphi+access.控件为ADOQuery
      

  7.   

    谢谢delphi1234(披着羊皮的狼) 在sum(b.本月已收) 中用不着用sum吧??因为各月的已收额对应着各月的已收额
      

  8.   

    在sum(b.本月已收) 中,是因为我担心你的表中可能会存在一个月多次交费的情况,所以用了SUM函数,如果你的表中只有一次交费的话,这里用了SUM也不会有问题.
      

  9.   

    应该是外联接吧。
      R := 'Select * From yingshou where 月份 = 5 '
      S := 'Select * From yishou where 月份 = 5 '  K := '(' + R + ') as R Left Join (' + S + ') as S Where R.编号=S.编号';  余额本来应该在缴费是自动更新,如果你不更新,你可以在DBGrid的OnGetText里写
      
      Text := FormatFloat(格式,FieldByName('本月已收').AsFloat - FieldByName(本月应收).AsFloat + Sender.AsFloat);
      

  10.   

    to : delphi1234(披着羊皮的狼) 。。你的sql语句执行时出错了:(有个疑问:"本月已收="这几个字是应该在sql语句中确实存在还是你的注释?还有就是选择第几月份应该怎么体现出来??我在where后这样写你看行吗?where a.当前余额>=0 and a.yuefen=''5'';
      

  11.   

    to : xuejinlong(垃圾) 。。你写的是伪代码吗??具体应该怎么把R,S整合到一条SQL中呢?
      

  12.   


      Select * From yingjiao Where 月份= 5 Left Join (Select * From yijiao Where 月份 = 5) S  On yingjiao.月份 = S.月份
      

  13.   

    不好意思,应该是 Select * From yingjiao Where 月份= 5 Left Join (Select * From yijiao Where 月份 = 5) S  On yingjiao.编号 = S.编号
      

  14.   

    上面我写的语句是SQL SERVER2000的语句,下面是我在ACCESS数据库在的调试通过的语句1.交费情况:select a.编号,a.月份 ,a.本月应收, 
    (select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份)  as 本月已收 , a.当前余额
    from yingshou a
    where a.当前余额>=0   (查询所有数据)
    2.欠费情况:select a.编号,a.月份 ,a.本月应收, 
    (select sum(b.本月已收) from yishou b where b.编号=a.编号 and b.月份=a.月份)  as 本月已收 , a.当前余额
    from yingshou a
    where a.当前余额<0 and a.月份='5'  (查询5月份的数据)
      

  15.   

    非常非常非常感谢 xuejinlong(垃圾) 同志。。采用你的方法大致达到了要求(当然还需要改动不少东东一定给分。。一定其他同志如 delphi1234(披着羊皮的狼) 我也不会亏待。!!!!!!!!!!,等我把任务完成后再一个个测试采用你们的提供的思路。。任务要紧!!不好意思!非常感谢大家的帮助!!!!!!