2014-10-06 48 views
0

我有兩個表說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; 
+0

請出示表列的定義,什麼是「gldtl」功能? – OldProgrammer 2014-10-06 15:42:36

+0

我的想法並不清楚,但是從你的描述中,不會有一個簡單的SUM()... GROUP BY ...或SUM()OVER(PARTITION ...) ? – 2014-10-06 16:44:19

+0

@OldProgrammer - 'gldtl'是過程中的一個變量 - FETCH ... BULK COLLECT的目標。 – 2014-10-06 16:48:42

回答

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 
+0

謝謝Sylvain ..這也可以把我排除在外。感謝您對SQL和PL/SQL過程的所有建議。 – 2014-10-07 06:22:24