我有两个表:
1、mcardacc表,有两个字段
accno:账户号码
balance:余额2、creditDetail表
accno:与表mcardacc的账户号码对应
flag:1表示增加账户金额,2表示减少账户金额
ammout:增加或减少金额的数额
effdate:增加或减少操作的生效日期,例如有一个账户号码是100012,在8月16日有一次调整,给该账户增加100元金额,然后生效日期是8月19日。我要做的是,当用户选择一个查询日期时,用存储过程完成根据账户号码和查询日期,找到mycardacc表的对应记录,得到当前余额。然后获取creditDetail表的所有该账户的调整交易,1表示增加、2表示减少,这些交易的effdate早于或等于查询日期,然后计算出该日期,该账户可以使用的余额,这个估计要涉及到循环处理,我比较菜,刚刚学oracle,哪位高手帮忙写一下,感谢!
1、mcardacc表,有两个字段
accno:账户号码
balance:余额2、creditDetail表
accno:与表mcardacc的账户号码对应
flag:1表示增加账户金额,2表示减少账户金额
ammout:增加或减少金额的数额
effdate:增加或减少操作的生效日期,例如有一个账户号码是100012,在8月16日有一次调整,给该账户增加100元金额,然后生效日期是8月19日。我要做的是,当用户选择一个查询日期时,用存储过程完成根据账户号码和查询日期,找到mycardacc表的对应记录,得到当前余额。然后获取creditDetail表的所有该账户的调整交易,1表示增加、2表示减少,这些交易的effdate早于或等于查询日期,然后计算出该日期,该账户可以使用的余额,这个估计要涉及到循环处理,我比较菜,刚刚学oracle,哪位高手帮忙写一下,感谢!
(SELECT SUM(AMMOUNT * DECODE(FLAG, 1, 1, -1)) + T.BALANCE
FROM CREDITDETAIL
WHERE ACCNO = T.ACCNO
AND EFFDATE <= SYSDATE) NEW_BALANCE
FROM MCARDACC T;
SELECT T0.ACCNO,T1.FLAG,T1.AMMOUNT,T1.EFFDATE,T0.BALANCE + T1.YE NEW_BALANCE
FROM (
SELECT C.ACCNO,C.FLAG,C.AMMOUNT,C.EFFDATE,
SUM(C.AMMOUNT * DECODE(C.FLAG, 1, 1, -1)) OVER (PARTITION BY C.ACCNO ORDER BY C.EFFDATE) YE
FROM CREDITDETAIL C WHERE C.EFFDATE <= SYSDATE ) T1
WHERE T0.ACCNO=T1.ACCNO;
SELECT T0.ACCNO,T1.FLAG,T1.AMMOUNT,T1.EFFDATE,T0.BALANCE + T1.YE NEW_BALANCE
FROM MCARDACC T0, (
SELECT C.ACCNO,C.FLAG,C.AMMOUNT,C.EFFDATE,
SUM(C.AMMOUNT * DECODE(C.FLAG, 1, 1, -1)) OVER (PARTITION BY C.ACCNO ORDER BY C.EFFDATE) YE
FROM CREDITDETAIL C WHERE C.EFFDATE <= SYSDATE ) T1
WHERE T0.ACCNO=T1.ACCNO;
SELECT mc.balance
FROM mcardacc mc
WHERE mc.accno = inputaccno;
/*二、查询日期之前的所有交易:*/
SELECT accno,DECODE(flag,1,'增加',2,'减少'),ammout,effdate
FROM creditdetail cd
WHERE cd.effdate <= selecteddate
AND cd.accno = inputaccno;
/*三、该帐户在查询日期(用selecteddate表示)可以使用的余额:
用当前余额减去在当前日期到所选日期之间的增加金额,加上在当前日期到所选日期之间的减少金额,
就是你在所选日期的可用金额.(输入帐号用inputaccno表示)*/
SELECT mc.balance +
(SELECT SUM(DECODE(cd.flag,1,-1,2,1)*cd.ammout)
FROM creditdetail cd,mcardacc mc
WHERE cd.effdate >= selecteddate
AND cd.effdate <= sysdate
AND cd.accno = inputaccno)
AND mc.accno = inputaccno;
/*三、该帐户在查询日期(用selecteddate表示)可以使用的余额:
用当前余额减去在当前日期到所选日期之间的增加金额,加上在当前日期到所选日期之间的减少金额,
就是你在所选日期的可用金额.(输入帐号用inputaccno表示)*/SELECT mc.balance +
(SELECT SUM(DECODE(cd.flag,1,-1,2,1)*cd.ammout)
FROM creditdetail cd
WHERE cd.effdate >= selecteddate
AND cd.effdate <= sysdate
AND cd.accno = inputaccno)
FROM mcardacc mc
AND mc.accno = inputaccno;
cd.effdate > selecteddate