2009-09-01 13 views
-4

大きなクエリを書く必要がないように、次のクエリを実装する必要があります。 プロシージャ、関数、または匿名ブロックを使用して実装してください。このような大きなクエリを書く必要がないような方法で、次のクエリを実装する必要があります。

wk_units1-105は列名 cnt_sls_dm.fct_sales_summaryテーブル名です。 は、我々は我々が機能以下適用するPL/SQLで何かを作成する必要が要するにb.fct_sales_summary

の週1で
a.fct_sales_summary の同じテーブルが、週2内のデータを比較している(私は儀式です)

SELECT DISTINCT A.bio_id , 
    DECODE(A.wk_units2 - B.wk_units1,0,NULL,A.wk_units2) prev, 
    DECODE(A.wk_units2 - B.wk_units1,0,NULL,B.wk_units1) curr, 
    DECODE(A.wk_units3 -B.wk_units2,0,NULL,A.wk_units3) prev, 
    DECODE(A.wk_units3 -B.wk_units2,0,NULL,B.wk_units2) curr, 
    DECODE(A.wk_units4 -B.wk_units3,0,NULL,A.wk_units4) prev, 
    DECODE(A.wk_units4 -B.wk_units3,0,NULL,B.wk_units3) curr, 
    DECODE(A.wk_units5 -B.wk_units4,0,NULL,A.wk_units5) prev, 
    DECODE(A.wk_units5 -B.wk_units4,0,NULL,B.wk_units4) curr, 
    DECODE(A.wk_units6 -B.wk_units5,0,NULL,A.wk_units6) prev, 
    DECODE(A.wk_units6 -B.wk_units5,0,NULL,B.wk_units5) curr 
    .           .       . 
    .           .       . 
    .           .       . 
    DECODE(A.wk_units105 -B.wk_units104,0,NULL,A.wk_units105) prev, 
    DECODE(A.wk_units105 -B.wk_units105,0,NULL,B.wk_units104) curr 
    FROM 
    cnt_sls_dm.fct_sales_summary A, 
    cnt_sls_dm.fct_sales_summary B 
    WHERE 
    A.bio_id=B.bio_id AND A.bio_id<>0 
    AND ROWNUM<25 
    AND (A.wk_units2<> B.wk_units1 
    OR A.wk_units3<> B.wk_units2 
    OR A.wk_units4<> B.wk_units3 
    OR A.wk_units5<> B.wk_units4 
    OR A.wk_units6<> B.wk_units5 
    .      . 
    .      . 
    .      . 
    OR A.wk_units105<>B.wk_units104) 

The output is like: 
     BIO_ID  PREV CURR PREV_1 CURR_1 PREV_2 CURR_2 PREV_3 CURR_3 
    5,032,130.00 -1  0   0   1   0   1 
    5,032,130.00  1  0   0   1   1   0  0   1 
    5,032,130.00  0  1   0   1 
    5,032,130.00  1  0   1   1   0   0  0   1 
    5,032,328.00  5  3   0   36   0   2  0   0 

我々はそれが我々が出すべきで

DECLARE 
    sql_str long(32000); 
    where_str long(32000); 
    counter NUMBER(3):=0; 
    BEGIN 
    sql_str:='SELECT '||'A.bio_id ,'; 
    where_str:=' where '||'A.bio_id=B.bio_id AND'||' A.bio_id<>0 and rownum<25 AND (' ; 
    LOOP 
    counter:=counter+1; 
    sql_str:=sql_str||'decode(A.wk_units'||(counter+1)||' - B.wk_units'|| (counter)||',0,NULL,A.wk_units'||(counter+1)||')'; 
sql_str:=sql_str||', decode(A.wk_units'||(counter+1)||' - B.wk_units'|| (counter)||',0,NULL,B.wk_units'||(counter)||')' ; 
    where_str:=where_str||' A.wk_units'||(counter+1)||'<> B.wk_units'||(counter) ; 
    EXIT WHEN counter=50; 
    sql_str:=sql_str||', '; 
    where_str:=where_str||' or '; 
    END LOOP; 
    sql_str:=sql_str||' from cnt_sls_dm.fct_sales_summary A, cnt_sls_dm.fct_sales_summary B'; 
    sql_str:=sql_str||where_str||')'; 
    dbms_output.put_line(sql_str); 
    EXECUTE IMMEDIATE (sql_str); 
    END; 

仕事doesntの次のものを実装レコードとして置くが、私たちはヒキガエルでうまく動作している出力として次のクエリを取得しているが、上記のスクリプトでは結果がレコードではなくクエリとして取得されるようにする............

SELECT A.bio_id ,DECODE(A.wk_units2 - B.wk_units1,0,NULL,A.wk_units2), 
DECODE(A.wk_units2 - B.wk_units1,0,NULL,B.wk_units1), DECODE(A.wk_units3 - 
B.wk_units2,0,NULL,A.wk_units3), DECODE(A.wk_units3 - 
B.wk_units2,0,NULL,B.wk_units2), DECODE(A.wk_units4 - 
B.wk_units3,0,NULL,A.wk_units4), DECODE(A.wk_units4 - 
B.wk_units3,0,NULL,B.wk_units3), DECODE(A.wk_units5 - 
B.wk_units4,0,NULL,A.wk_units5), DECODE(A.wk_units5 - 
B.wk_units4,0,NULL,B.wk_units4), DECODE(A.wk_units6 - 
B.wk_units5,0,NULL,A.wk_units6), DECODE(A.wk_units6 - 
B.wk_units5,0,NULL,B.wk_units5), DECODE(A.wk_units7 - 
B.wk_units6,0,NULL,A.wk_units7), DECODE(A.wk_units7 - 
B.wk_units6,0,NULL,B.wk_units6), DECODE(A.wk_units8 - 
B.wk_units7,0,NULL,A.wk_units8), DECODE(A.wk_units8 - 
B.wk_units7,0,NULL,B.wk_units7), DECODE(A.wk_units9 - 
B.wk_units8,0,NULL,A.wk_units9), DECODE(A.wk_units9 - 
B.wk_units8,0,NULL,B.wk_units8), DECODE(A.wk_units10 - 
B.wk_units9,0,NULL,A.wk_units10), DECODE(A.wk_units10 - 
B.wk_units9,0,NULL,B.wk_units9), DECODE(A.wk_units11 - 
B.wk_units10,0,NULL,A.wk_units11), DECODE(A.wk_units11 - 
B.wk_units10,0,NULL,B.wk_units10), DECODE(A.wk_units12 - 
B.wk_units11,0,NULL,A.wk_units12), DECODE(A.wk_units12 - 
B.wk_units11,0,NULL,B.wk_units11), DECODE(A.wk_units13 - 
B.wk_units12,0,NULL,A.wk_units13), DECODE(A.wk_units13 - 
B.wk_units12,0,NULL,B.wk_units12), DECODE(A.wk_units14 - 
B.wk_units13,0,NULL,A.wk_units14), DECODE(A.wk_units14 - 
B.wk_units13,0,NULL,B.wk_units13), DECODE(A.wk_units15 - 
B.wk_units14,0,NULL,A.wk_units15), DECODE(A.wk_units15 - 
B.wk_units14,0,NULL,B.wk_units14), DECODE(A.wk_units16 - 
B.wk_units15,0,NULL,A.wk_units16), DECODE(A.wk_units16 - 
B.wk_units15,0,NULL,B.wk_units15), DECODE(A.wk_units17 - 
B.wk_units16,0,NULL,A.wk_units17), DECODE(A.wk_units17 - 
B.wk_units16,0,NULL,B.wk_units16), DECODE(A.wk_units18 - 
B.wk_units17,0,NULL,A.wk_units18), DECODE(A.wk_units18 - 
B.wk_units17,0,NULL,B.wk_units17), DECODE(A.wk_units19 - 
B.wk_units18,0,NULL,A.wk_units19), DECODE(A.wk_units19 - 
B.wk_units18,0,NULL,B.wk_units18), DECODE(A.wk_units20 - 
B.wk_units19,0,NULL,A.wk_units20), DECODE(A.wk_units20 - 
B.wk_units19,0,NULL,B.wk_units19), DECODE(A.wk_units21 - 
B.wk_units20,0,NULL,A.wk_units21), DECODE(A.wk_units21 - 
B.wk_units20,0,NULL,B.wk_units20), DECODE(A.wk_units22 - 
B.wk_units21,0,NULL,A.wk_units22), DECODE(A.wk_units22 - 
B.wk_units21,0,NULL,B.wk_units21), DECODE(A.wk_units23 - 
B.wk_units22,0,NULL,A.wk_units23), DECODE(A.wk_units23 - 
B.wk_units22,0,NULL,B.wk_units22), DECODE(A.wk_units24 - 
B.wk_units23,0,NULL,A.wk_units24), DECODE(A.wk_units24 - 
B.wk_units23,0,NULL,B.wk_units23), DECODE(A.wk_units25 - 
B.wk_units24,0,NULL,A.wk_units25), DECODE(A.wk_units25 - 
B.wk_units24,0,NULL,B.wk_units24), DECODE(A.wk_units26 - 
B.wk_units25,0,NULL,A.wk_units26), DECODE(A.wk_units26 - 
B.wk_units25,0,NULL,B.wk_units25), DECODE(A.wk_units27 - 
B.wk_units26,0,NULL,A.wk_units27), DECODE(A.wk_units27 - 
B.wk_units26,0,NULL,B.wk_units26), DECODE(A.wk_units28 - 
B.wk_units27,0,NULL,A.wk_units28), DECODE(A.wk_units28 - 
B.wk_units27,0,NULL,B.wk_units27), DECODE(A.wk_units29 - 
B.wk_units28,0,NULL,A.wk_units29), DECODE(A.wk_units29 - 
B.wk_units28,0,NULL,B.wk_units28), DECODE(A.wk_units30 - 
B.wk_units29,0,NULL,A.wk_units30), DECODE(A.wk_units30 - 
B.wk_units29,0,NULL,B.wk_units29), DECODE(A.wk_units31 - 
B.wk_units30,0,NULL,A.wk_units31), DECODE(A.wk_units31 - 
B.wk_units30,0,NULL,B.wk_units30), DECODE(A.wk_units32 - 
B.wk_units31,0,NULL,A.wk_units32), DECODE(A.wk_units32 - 
B.wk_units31,0,NULL,B.wk_units31), DECODE(A.wk_units33 - 
B.wk_units32,0,NULL,A.wk_units33), DECODE(A.wk_units33 - 
B.wk_units32,0,NULL,B.wk_units32), DECODE(A.wk_units34 - 
B.wk_units33,0,NULL,A.wk_units34), DECODE(A.wk_units34 - 
B.wk_units33,0,NULL,B.wk_units33), DECODE(A.wk_units35 - 
B.wk_units34,0,NULL,A.wk_units35), DECODE(A.wk_units35 - 
B.wk_units34,0,NULL,B.wk_units34), DECODE(A.wk_units36 - 
B.wk_units35,0,NULL,A.wk_units36), DECODE(A.wk_units36 - 
B.wk_units35,0,NULL,B.wk_units35), DECODE(A.wk_units37 - 
B.wk_units36,0,NULL,A.wk_units37), DECODE(A.wk_units37 - 
B.wk_units36,0,NULL,B.wk_units36), DECODE(A.wk_units38 - 
B.wk_units37,0,NULL,A.wk_units38), DECODE(A.wk_units38 - 
B.wk_units37,0,NULL,B.wk_units37), DECODE(A.wk_units39 - 
B.wk_units38,0,NULL,A.wk_units39), DECODE(A.wk_units39 - 
B.wk_units38,0,NULL,B.wk_units38), DECODE(A.wk_units40 - 
B.wk_units39,0,NULL,A.wk_units40), DECODE(A.wk_units40 - 
B.wk_units39,0,NULL,B.wk_units39), DECODE(A.wk_units41 - 
B.wk_units40,0,NULL,A.wk_units41), DECODE(A.wk_units41 - 
B.wk_units40,0,NULL,B.wk_units40), DECODE(A.wk_units42 - 
B.wk_units41,0,NULL,A.wk_units42), DECODE(A.wk_units42 - 
B.wk_units41,0,NULL,B.wk_units41), DECODE(A.wk_units43 - 
B.wk_units42,0,NULL,A.wk_units43), DECODE(A.wk_units43 - 
B.wk_units42,0,NULL,B.wk_units42), DECODE(A.wk_units44 - 
B.wk_units43,0,NULL,A.wk_units44), DECODE(A.wk_units44 - 
B.wk_units43,0,NULL,B.wk_units43), DECODE(A.wk_units45 - 
B.wk_units44,0,NULL,A.wk_units45), DECODE(A.wk_units45 - 
B.wk_units44,0,NULL,B.wk_units44), DECODE(A.wk_units46 - 
B.wk_units45,0,NULL,A.wk_units46), DECODE(A.wk_units46 - 
B.wk_units45,0,NULL,B.wk_units45), DECODE(A.wk_units47 - 
B.wk_units46,0,NULL,A.wk_units47), DECODE(A.wk_units47 - 
B.wk_units46,0,NULL,B.wk_units46), DECODE(A.wk_units48 - 
B.wk_units47,0,NULL,A.wk_units48), DECODE(A.wk_units48 - 
B.wk_units47,0,NULL,B.wk_units47), DECODE(A.wk_units49 - 
B.wk_units48,0,NULL,A.wk_units49), DECODE(A.wk_units49 - 
B.wk_units48,0,NULL,B.wk_units48), DECODE(A.wk_units50 - 
B.wk_units49,0,NULL,A.wk_units50), DECODE(A.wk_units50 - 
B.wk_units49,0,NULL,B.wk_units49), DECODE(A.wk_units51 - 
B.wk_units50,0,NULL,A.wk_units51), DECODE(A.wk_units51 - 
B.wk_units50,0,NULL,B.wk_units50) FROM cnt_sls_dm.fct_sales_summary A, 
cnt_sls_dm.fct_sales_summary B WHERE A.bio_id=B.bio_id AND A.bio_id<>0 AND 
ROWNUM<25 AND (A.wk_units2<> B.wk_units1 OR A.wk_units3<> B.wk_units2 OR 
A.wk_units4<> B.wk_units3 OR A.wk_units5<> B.wk_units4 OR A.wk_units6<> 
B.wk_units5 OR A.wk_units7<> B.wk_units6 OR A.wk_units8<> B.wk_units7 OR 
A.wk_units9<> B.wk_units8 OR A.wk_units10<> B.wk_units9 OR A.wk_units11<> 
B.wk_units10 OR A.wk_units12<> B.wk_units11 OR A.wk_units13<> B.wk_units12 OR 
A.wk_units14<> B.wk_units13 OR A.wk_units15<> B.wk_units14 OR A.wk_units16<> 
B.wk_units15 OR A.wk_units17<> B.wk_units16 OR A.wk_units18<> B.wk_units17 OR 
A.wk_units19<> B.wk_units18 OR A.wk_units20<> B.wk_units19 OR A.wk_units21<> 
B.wk_units20 OR A.wk_units22<> B.wk_units21 OR A.wk_units23<> B.wk_units22 OR 
A.wk_units24<> B.wk_units23 OR A.wk_units25<> B.wk_units24 OR A.wk_units26<> 
B.wk_units25 OR A.wk_units27<> B.wk_units26 OR A.wk_units28<> B.wk_units27 OR 
A.wk_units29<> B.wk_units28 OR A.wk_units30<> B.wk_units29 OR A.wk_units31<> 
B.wk_units30 OR A.wk_units32<> B.wk_units31 OR A.wk_units33<> B.wk_units32 OR 
A.wk_units34<> B.wk_units33 OR A.wk_units35<> B.wk_units34 OR A.wk_units36<> 
B.wk_units35 OR A.wk_units37<> B.wk_units36 OR A.wk_units38<> B.wk_units37 OR 
A.wk_units39<> B.wk_units38 OR A.wk_units40<> B.wk_units39 OR A.wk_units41<> 
B.wk_units40 OR A.wk_units42<> B.wk_units41 OR A.wk_units43<> B.wk_units42 OR 
A.wk_units44<> B.wk_units43 OR A.wk_units45<> B.wk_units44 OR A.wk_units46<> 
B.wk_units45 OR A.wk_units47<> B.wk_units46 OR A.wk_units48<> B.wk_units47 OR 
A.wk_units49<> B.wk_units48 OR A.wk_units50<> B.wk_units49 OR A.wk_units51<> 
B.wk_units50) 

答えて

5

もっとコンパクトにするには、テーブルを正規化します。あなたのような名前の列がある場合:

wk_units1 
wk_units2 
wk_units3 
... 
wk_units48 
wk_units49 
wk_units50 

を必要な場合いつでも私たちはPIVOTクエリの列の位置に戻し、それらを引っ張ってすることができ、行にそれらを正規化することができます。

+0

どのようにピボットすることができますか私は任意のアイデアを与えることができます – Irveen

+1

ここピボットの例です:http://www.adp-gmbh.ch/ora/sql/examples/pivot.html私のお勧めは、あなたの問題のためのテーブルを設計する。あなたのテーブルがよりよく設計されていれば、あなたのクエリは簡単になります。 –

関連する問題