2012-02-17 44 views
0

我有以下配置:一個稱爲源(bid,valid_from,valid_to,qty)和目標(bid,jan,feb,mar,apr,....,dec)的表。 我想從源數據插入到原點,(同樣劈裂的數量到VALID_FROM,失效日期個月,其餘剩下的最後一個月的時間內)是這樣的:如果源記錄是Oracle時間表轉換

00001  01.02.2001 31.06.2001  132 

這將被翻譯成目標:

00001 0 26 26 26 26 28 0 0 0 0 0 0 

我怎麼能這樣做? 謝謝!

+0

我認爲拆分應該是'0 27 27 27 27 24 0 0 ...' – 2012-02-17 09:35:47

+0

感謝林,但132 DIV 5 = 26,132 MOD 5 = 2 - 這些都是我想要的規則用於數量拆分 – maephisto 2012-02-17 11:17:30

回答

2

我假設valid_from/valid_to從不跨越多年;即,TO_DATE(valid_from,'YYYY')總是= TO_DATE(valid_to,'YYYY')

SQL> CREATE TABLE source (
    2  bid   VARCHAR2(5) 
    3 , valid_from DATE 
    4 , valid_to DATE 
    5 , qty   NUMBER 
    6 ); 

Table created. 

SQL> INSERT INTO source VALUES ('00001',TO_DATE('20010201','YYYYMMDD'),TO_DATE('20010630','YYYYMMDD'),132); 

1 row created. 

SQL> INSERT INTO source VALUES ('00002',TO_DATE('20020301','YYYYMMDD'),TO_DATE('20021231','YYYYMMDD'),59); 

1 row created. 

SQL> CREATE TABLE destination (
    2  bid   VARCHAR2(5) 
    3 , jan   NUMBER 
    4 , feb   NUMBER 
    5 , mar   NUMBER 
    6 , apr   NUMBER 
    7 , may   NUMBER 
    8 , jun   NUMBER 
    9 , jul   NUMBER 
10 , aug   NUMBER 
11 , sep   NUMBER 
12 , oct   NUMBER 
13 , nov   NUMBER 
14 , dec   NUMBER 
15 ); 

Table created. 

SQL> COLUMN jan FORMAT 999 
SQL> COLUMN feb FORMAT 999 
SQL> COLUMN mar FORMAT 999 
SQL> COLUMN apr FORMAT 999 
SQL> COLUMN may FORMAT 999 
SQL> COLUMN jun FORMAT 999 
SQL> COLUMN jul FORMAT 999 
SQL> COLUMN aug FORMAT 999 
SQL> COLUMN sep FORMAT 999 
SQL> COLUMN oct FORMAT 999 
SQL> COLUMN nov FORMAT 999 
SQL> COLUMN dec FORMAT 999 
SQL> INSERT INTO destination 
    2 SELECT bid 
    3 ,  NVL(MAX(DECODE(r,01,split_qty)),0) jan 
    4 ,  NVL(MAX(DECODE(r,02,split_qty)),0) feb 
    5 ,  NVL(MAX(DECODE(r,03,split_qty)),0) mar 
    6 ,  NVL(MAX(DECODE(r,04,split_qty)),0) apr 
    7 ,  NVL(MAX(DECODE(r,05,split_qty)),0) may 
    8 ,  NVL(MAX(DECODE(r,06,split_qty)),0) jun 
    9 ,  NVL(MAX(DECODE(r,07,split_qty)),0) jul 
10 ,  NVL(MAX(DECODE(r,08,split_qty)),0) aug 
11 ,  NVL(MAX(DECODE(r,09,split_qty)),0) sep 
12 ,  NVL(MAX(DECODE(r,10,split_qty)),0) oct 
13 ,  NVL(MAX(DECODE(r,11,split_qty)),0) nov 
14 ,  NVL(MAX(DECODE(r,12,split_qty)),0) dec 
15 FROM 
16 (
17 SELECT x.bid 
18 ,  x.month_abbr 
19 ,  x.r 
20 ,  x.rn 
21 ,  x.total_months 
22 ,  x.qty 
23 ,  FLOOR(x.qty/x.total_months) 
24   + DECODE(x.rn 
25     ,  x.total_months, MOD(x.qty, x.total_months) 
26     ,  0)       split_qty 
27 FROM (SELECT  s.bid 
28   ,   months.r 
29   ,   ROW_NUMBER() 
30     OVER (PARTITION BY s.bid 
31       ORDER BY  months.r)   rn 
32   ,   COUNT(*) 
33     OVER (PARTITION BY s.bid)    total_months 
34   ,   s.qty 
35   FROM  (SELECT  ROWNUM r 
36     FROM  DUAL 
37     CONNECT BY LEVEL <= 12) months 
38   ,   source     s 
39   WHERE  TO_CHAR(s.valid_from,'YYYY') = TO_CHAR(s.valid_to,'YYYY') 
40   AND  months.r BETWEEN TO_NUMBER(TO_CHAR(s.valid_from,'MM')) 
41         AND TO_NUMBER(TO_CHAR(s.valid_to,'MM'))) x 
42 ) 
43 GROUP BY bid 
44 ; 

2 rows created. 

SQL> SELECT * 
    2 FROM destination 
    3 ; 

BID JAN FEB MAR APR MAY JUN JUL AUG SEP OCT NOV DEC 
----- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- 
00001 0 26 26 26 26 28 0 0 0 0 0 0 
00002 0 0 5 5 5 5 5 5 5 5 5 14 

SQL> 
+0

Thankyou @Tebbe爲您的答案和您的努力! – maephisto 2012-02-20 06:56:19