17,377
社区成员
发帖
与我相关
我的任务
分享
select ab.balance*lag(acc.time,1,to_date('2008-09-30','yyyy-MM-dd')) over (partition by ab.accountno order by ab.time desc)
from account acc
left join account_balance ab
on acc.accountNo=ab.accountNo
SELECT da,sum(nn_b)/(TO_DATE('2008-9-30', 'yyyy-mm-dd') - CASE
WHEN accountdate > TO_DATE('2008-9-1', 'yyyy-mm-dd') THEN
TRUNC(accountdate)
ELSE
TO_DATE('2008-9-1', 'yyyy-mm-dd')
END+1) AVG_MONEY
FROM(
SELECT BA, BALANCE,new_b, ACCDATE, DA, ACCOUNTMONEY, N_MONEY, ACCOUNTDATE, VD,
CASE WHEN new_b IS NULL THEN n_money ELSE new_b END nn_b
FROM (
SELECT B.ACCOUNTNO BA,
B.BALANCE,
(SELECT balance FROM account_balance WHERE accdate =(SELECT MAX(accdate) FROM
account_balance WHERE accdate<=d.vd AND accountno=d.ACCOUNTNO)) new_b,
B.ACCDATE,
D.ACCOUNTNO DA,
D.ACCOUNTMONEY,
CASE WHEN d.accountdate>d.vd THEN 0 ELSE d.ACCOUNTMONEY END n_money,
D.ACCOUNTDATE,
D.VD
FROM ACCOUNT_BALANCE B,
(SELECT *
FROM ACCOUNT A,
(SELECT TO_DATE('2008-9-1', 'yyyy-mm-dd') + ROWNUM - 1 VD
FROM DUAL
CONNECT BY ROWNUM <= TO_DATE('2008-9-30', 'yyyy-mm-dd') -
TO_DATE('2008-9-1', 'yyyy-mm-dd') + 1) C
WHERE a.accountdate<=TO_DATE('2008-9-30', 'yyyy-mm-dd')
) D
WHERE B.ACCOUNTNO(+) = D.ACCOUNTNO
AND B.ACCDATE(+) = D.VD
AND b.accdate(+)<=TO_DATE('2008-9-30', 'yyyy-mm-dd')
AND b.accdate(+)>=TO_DATE('2008-9-1', 'yyyy-mm-dd')
)ORDER BY DA, VD
)
GROUP BY da,accountdate
ORDER BY da;
--输出:
/*
DA AVG_MONEY
001 8100
002 1066.66666666667
003 3000
*/