姓名 应交金额 实交金额
琵琶  150      150
琵琶  150      100
中止  130      130
中止  140      140
统计出两个人的收入总和就是实金额总和正常收入笔数,欠款总额欠款笔数
结应该是
      收入金额  正常笔数  欠款总额  欠款笔数
琵琶    250      1        50       1
中止    270      2        0        0

解决方案 »

  1.   

    select sum(应交金额),sum(实交金额),(应交金额-实交金额 ) as 欠款总额,sum((case when (应交金额-实交金额)>0 then 1 else 0 end)) as 欠款笔数 ,交款日期, 服务项目  from table group by 交款日期, 服务项目
      

  2.   

    /**根据时间汇总收入单据**/
    CREATE PROCEDURE StatBill
    @recRegtime datetime,
    @serID varchar(4)
     AS
    SELECT dbo.user_info.id, dbo.user_info.userName, lin.conRealMoney, lin.sumRealMoney,d.sumArrearage, d.countArrearage
    FROM dbo.user_info LEFT OUTER JOIN
    (select b.empID,sum(b.realMoney)as sumRealMoney,count(b.realMoney) as conRealMoney
    from 
    (select * from finReceipt as a 
    where a.serID = @serID and (a.recRegtime >@recRegtime) AND (a.recRegtime <dateadd(day,1,@recRegtime)))as b
    group by b.empID) as lin on 
     user_info.id=lin.empID left outer join 
    (select SUM(a.dueMoney)-SUM(a.realMoney) as sumArrearage ,count(*) as countArrearage ,a.empID   FROM dbo.finReceipt as a  LEFT OUTER JOIN
                   dbo.svrInfo b ON a.serID = b.id where a.dueMoney > a.realMoney GROUP BY a.empID   ) as d
    on  user_info.id= d.empID
    GO
      

  3.   

    十分感谢luck749你的比我写的好多了。这两种方法哪种效率更高一些呢?
      

  4.   

    根据lucky749  提示得出SELECT dbo.user_info.id, dbo.user_info.userName, lin.conRealMoney, lin.sumRealMoney,lin.countArrearage,lin.sumArrearage
    FROM dbo.user_info LEFT OUTER JOIN
    (select b.empID,sum(b.realMoney)as sumRealMoney,count(b.realMoney) as conRealMoney,
    sum((case when (realMoney-duemoney)<0 then 1 else 0 end)) as countArrearage,sum(duemoney-realMoney) as sumArrearage
    from 
    (select * from finReceipt as a 
    where a.serID = '1119' and (a.recRegtime > '2008-02-15') AND (a.recRegtime <dateadd(day,1,'2008-02-15')))as b
    group by b.empID) as lin on user_info.id=lin.empID