借款表A    id       借款金额     余额        借款日期
kmlkj232lkjl   500         500         2006-07-12
kmlkj22lkjl     600         600         2006-07-14
..             ..          ..             ..
..             ..          ..             ..

还款表B    sourceid       还款金额            还款日期
kmlkj232lkjl      100           2006-07-15     
kmlkj232lkjl      200           2006-07-17
     ..            ..               ..
     ..            ..               ..
     
表B的sourceid关联表A的id,
根据借款来还款,用源借款单借款金额减还款单还款金额得到借款单的余额,
如:初始借款500,余额 500,若还款100,则余额400....
一笔借款可能有几笔还款也可能没有还款。

现统计7月12号后到8月1号,每天借款余额的和
如  7月12日   余额和为  500
    7月13日   余额和为  500 
    7月14日   余额和为  1100   (500+600)
    7月15日   余额和为  1000    (500+600-100)
    7月16日   余额和为  1000     (500+600-100)
    7月17日   余额和为  800       (400+600-200)
    7月18日   余额和为  800       (400+600-200)
     ..          ..      ..            ..
    8月1日   余额和为  800       (400+600-200) 
    
    
借款日期和还款日期不是同一天。一笔7月12日的500的借款,
7月12日,该笔借款余额500,
7月13日,余额500,
7月14日,余额500,
到7月15日,由于还款了100,余额400,
7月16日,余额400,
7月17日,还款了200,余额200, 求SQL解答,不胜感激

解决方案 »

  1.   

    hehe ,比如一个礼拜的测试数据就好了啊看着描述感觉有点晕~
      

  2.   

    数据就是上面那个啊,表A有两笔借款啊,表B有两笔相对于表A7月12日的那笔借款的还款啊,结果就是每天的余额啊
      7月12日   余额和为  500
        7月13日   余额和为  500 
        7月14日   余额和为  1100   (500+600).........
      

  3.   

    统计一天的:
    declare @date datetime 
    set @date = '2006.07.12'
    select @date,(借款和.借款总额 - 还款和.还款总额)
    from 
      (select sum(借款表A.余额) as 借款总额 from  借款表A where 借款表A.借款日期 
          <=@date)  as 借款和,
      (select sum(还款表B.余额) as 还款总额 from  还款表B where 还款表B.还款日期 
          <=@date) as 还款和可以改为存储过程,加while做成循还,就可以统计一段时间的了.
      

  4.   

    yanguangyun(my_21sj) 兄
     不能这样直接减的,因为 借款单生成时借款金额就是借款余额,因为没有还款,当每次还款的时候都会用借款余额减还款金额,结果设为借款余额 
    借款单生成的时候借款金额就定了不变,借款余额是随着还款金额来扣减的
      

  5.   

    之前的表结构人家都定义好了撒,如果存储过程就要写很多版本,forMsSql,forOracle,forDB2...
    ):
      

  6.   

    呵呵,大概写了一个,没有验证,欢迎拍砖CREATE PROCEDURE COMPUTE_1
    /* Param List */
    @COMPUTE_BEGIN DATETIME = NULL,
    @COMPUTE_END DATETIME = NULL
    AS
    DECLARE @INIT_DATE DATETIME
    DECLARE @DATE_SUM DECIMAL(18,4)CREATE TABLE #T_RESULT
    ( C_DATE DATETIME,
    余额 DECIMAL(18,4))SET @INIT_DATE = @COMPUTE_BEGINWHILE @INIT_DATE < @COMPUTE_END
    BEGIN

    SELECT
    @DATE_SUM = C_C.SUM(余额合计)
    FROM
    ( SELECT
    A.id , (A.借款金额 - C_B.还款金额合计) AS 余额合计
    FROM
    A
    LEFT OUTER JOIN ( SELECT
    C_A.id , SUM(C_A.还款金额) AS 还款金额合计
    FROM
    ( SELECT
    A.id , B.还款金额 , B.还款日期
    FROM
    A
    LEFT OUTER JOIN B ON A.id = B.id
    WHERE
    B.还款日期 <=@COMPUTE_END ) AS C_A
    WHERE
    C_A.还款日期 <= @INIT_DATE
    GROUP BY
    C_A.id ) AS C_B ON A.id = C_B.id
    WHERE
    A.借款日期 <= @INIT_DATE ) AS C_C INSERT #T_RESULT VALUES (@INIT_DATE,@DATE_SUM)
    SET @INIT_DATE = DATEADD(dd,1,@INIT_DATE) ENDSELECT * FROM #T_RESULT
    DROP TABLE #T_RESULTGO
      

  7.   

    表的结构及数据借款表 loan
    id        amount           balance          loandate  
    i23km     500               200              2006-07-12 00:00:00.000
    355bm     600               600              2006-07-14 00:00:00.000还款表  repayment
    sourceid        repayamount             repaydate 
    i23km             100                     2006-07-15 00:00:00.000
    i23km             200                     2006-07-17 00:00:00.000每天的余额的SQL
    select sum(amount-isnull(repayamount,0)) amount from
    (
    select * from 
    (select * from loan where loandate <='2006-07-17 00:00:00.000') a
    left outer join 
    (
    select sourceid,sum(repayamount) repayamount 
    from repayment where repaydate <='2006-07-17 00:00:00.000'
    group by sourceid
    ) b 
    on a.id = b.sourceid
    ) c 把每天的余额合计起来可以把每天的SQL union 起来,MsSQl最多只能union256次,统计超过256次得用临时表,但是这样做,如果每天有5000笔借款,500笔还款,性能问题.......