借款表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解答,不胜感激
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解答,不胜感激
7月12日 余额和为 500
7月13日 余额和为 500
7月14日 余额和为 1100 (500+600).........
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做成循还,就可以统计一段时间的了.
不能这样直接减的,因为 借款单生成时借款金额就是借款余额,因为没有还款,当每次还款的时候都会用借款余额减还款金额,结果设为借款余额
借款单生成的时候借款金额就定了不变,借款余额是随着还款金额来扣减的
):
/* 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
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笔还款,性能问题.......