我有两个表:
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.   

    SELECT ACCNO,
           (SELECT SUM(AMMOUNT * DECODE(FLAG, 1, 1, -1)) + T.BALANCE
              FROM CREDITDETAIL
             WHERE ACCNO = T.ACCNO
               AND EFFDATE <= SYSDATE) NEW_BALANCE
      FROM MCARDACC T;
      

  2.   

    狂狼的方法好像比我自己弄出来的好,我是自己查询一个游标出来,循环判断游标中记录的flag记录,然后计算。我试试看狂狼的方法。
      

  3.   

    看题目好像是要求出每个交易日对应的余额吧,试试用分析函数:
    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;
      

  4.   

    少写了个表:
    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;
      

  5.   

    /*一、当前余额:*/
    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;
      

  6.   

    前面写的改一下:
    /*三、该帐户在查询日期(用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;
      

  7.   

    再改一下,应该是:
    cd.effdate > selecteddate