循环几个月

时间:2014-10-06 15:37:57

标签: plsql oracle11g

我有两个表说A(详细信息表)和B(汇总表)。

表A中的交易属于一年内的不同月份。表B定义了一些对应于特定月份的字段(如下所示)。我想要一个程序,它将从表A中获取记录并更新表B,使得第1个月的金额将在YTDBAL_1中汇总,第2个月将是第1个月的总和加上第2个月的总和(YTDBAL2),依此类推这样连续的月份将保持从年初到今天(当月)的累积余额。

表A中的样本数据

OFFCD     GLHEAD        YEAR        MONTH       AMOUNT  
010       10101001      2014        01          25,000.00  
010       10101001      2014        01           5,000.00  
010       10101001      2014        02           8,000.00  
010       10101001      2014        02           4,000.00  
010       10101001      2014        03          10,000.00  
010       10101001      2014        04          10,000.00  
010       10101001      2014        05          -4,000.00  
010       10101001      2014        05           3,000.00  
..  
..  
010       10101001      2014        12           1,000.00  

表B中的预期数据

OFFCD   GLHEAD    YEAR    YTDBAL_1  YTDBAL_2    YTDBAL_3   YTDBAL_4   YTDBAL_5  ..... YTDBAL_12  
010     10101001  2014    30,000    42,000      52,000     62,000     61,000            XXX

我的下面的程序填充了相同金额的所有字段。我如何做到这一点,我达到了预期的结果。 注意:事务表有超过一百万条记录,我使用的是Oracle 11g。

CREATE OR REPLACE PROCEDURE rectify_gl_bal(w_year Number)
IS
  CURSOR gl_cur IS
    Select * from nlmstdtl
      where period_year=w_year;

  TYPE gl_array IS TABLE OF gl_cur%ROWTYPE;

  gldtl gl_array;
Begin
  open gl_cur;

  Loop
    Fetch gl_cur bulk collect into gldtl limit 500;
    EXIT WHEN gldtl.count = 0;

    Forall x in 1..gldtl.count
      update nlmst
        set NLMST.YTDBAL_1 =  NLMST.YTDBAL_1 + gldtl(x).amount,
            NLMST.YTDBAL_2 =  NLMST.YTDBAL_2 + gldtl(x).amount,
            NLMST.YTDBAL_3 =  NLMST.YTDBAL_3 + gldtl(x).amount,
            NLMST.YTDBAL_4 =  NLMST.YTDBAL_4 + gldtl(x).amount,
            NLMST.YTDBAL_5 =  NLMST.YTDBAL_5 + gldtl(x).amount,
            NLMST.YTDBAL_6 =  NLMST.YTDBAL_6 + gldtl(x).amount,
            NLMST.YTDBAL_7 =  NLMST.YTDBAL_7 + gldtl(x).amount,
            NLMST.YTDBAL_8 =  NLMST.YTDBAL_8 + gldtl(x).amount,
            NLMST.YTDBAL_9 =  NLMST.YTDBAL_9 + gldtl(x).amount,
            NLMST.YTDBAL_10 =  NLMST.YTDBAL_10 + gldtl(x).amount,
            NLMST.YTDBAL_11 =  NLMST.YTDBAL_11 + gldtl(x).amount,
            NLMST.YTDBAL_12 =  NLMST.YTDBAL_12 + gldtl(x).amount
        where nlmst.offcd = gldtl(x).offcd and
              nlmst.period_year = gldtl(x).period_year and
              nlmst.glhead = gldtl(x).glhead;
  End Loop;

  commit;
  close gl_cur;
End;

1 个答案:

答案 0 :(得分:0)

真的需要写一个程序吗?不能做那样的事情:

SELECT OFFCD, GLHEAD, YEAR,
  SUM(CASE WHEN MONTH <= 01 THEN AMOUNT ELSE 0 END) YTDBAL_1,
  SUM(CASE WHEN MONTH <= 02 THEN AMOUNT ELSE 0 END) YTDBAL_2,
  SUM(CASE WHEN MONTH <= 03 THEN AMOUNT ELSE 0 END) YTDBAL_3,
  SUM(CASE WHEN MONTH <= 04 THEN AMOUNT ELSE 0 END) YTDBAL_4,
  SUM(CASE WHEN MONTH <= 05 THEN AMOUNT ELSE 0 END) YTDBAL_5
  -- and so on up to YTDBAL_12
  -- ...


  FROM A
  GROUP BY OFFCD, GLHEAD, YEAR

生成(给定样本数据的前8行):

OFFCD   GLHEAD      YEAR    YTDBAL_1    YTDBAL_2    YTDBAL_3    YTDBAL_4    YTDBAL_5
10      10101001    2014    30000       42000       52000       62000       61000