2

ピボットが必要なビューについて何らかの助けを得たいと思っていますが、よくわかりません。ビューは次の形式です。

CASE       CASE_ORDER     MANAGER    MONTHLY_CASES      FISCAL_CASES                                                                
case_1          1           John            15             84          
case_1          1           Jeff            10             80  
case_2          2           John            20             90  
case_2          2           Jeff            13             65  
case_3          3           John            7              72  
case_3          3           Jeff            17             70  

最終的なチャートは次のようになります。

CASE  CASE_ORDER   JOHN_CURR_MONTH  JOHN_FY        JOHN_CURR_MONTH  JOHN_FY               
case_1     1            15                84            10            80  
case_2     2            20                90            13            65  
case_3     3             7                72            17            70 

私の問題は、マネージャーが変わる可能性があり、マネージャーの数も月ごとに変わる可能性があるため、名前 (つまり、「mgr1」と「mgr2」) をハードコーディングして DECODE を使用できないことです。それは動的でなければなりません...

4

1 に答える 1

2

あなたの提案をありがとう、私はそれを理解しました。実際、Tom kyte のブログ (http://www.oracle.com/technetwork/issue-archive/2012/12-jul/o42asktom-1653097.html) にも同様の回答があり、目的のために変更しました。ここにあります:

CREATE OR REPLACE PROCEDURE dynamic_pivot_proc ( p_cursor IN OUT SYS_REFCURSOR )  
AS  
l_query LONG := 'SELECT case_order, case';   
BEGIN  
FOR x IN (SELECT DISTINCT manager FROM test_table ORDER BY 1 )  
LOOP  
    l_query := l_query ||  
    REPLACE( q'|, MAX(DECODE(manager,'$X$',monthly_total)) $X$_current_month|',   
            '$X$', dbms_assert.simple_sql_name(x.manager) ) ||  
    REPLACE( q'|, MAX(DECODE(manager,'$X$',fiscal_total)) $X$_fy|',   
           '$X$', dbms_assert.simple_sql_name(x.manager) );  
END LOOP;  
l_query := l_query || ' FROM test_table 
                        GROUP BY case_order, case
                        ORDER BY case_order ';
OPEN p_cursor FOR l_query;
END;

SQL> variable x refcursor;  
SQL> exec dynamic_pivot_proc( :x );  
SQL> print x  

CASE CASE_ORDER JEFF_CURRENT_MONTH JEFF_FY JOHN_CURRENT_MONTH JOHN_FY

1 ケース_1 10 80 15 84
2 ケース_2 13 65 20 90
3 ケース_3 17 70 7 72

結果を出力するのではなく、ビューに保存したいのです。どうすればそれを達成できますか?
行l_query LONG := 'SELECT case_order, case';を変更しようとしました。
with
l_query LONG := 'CREATE OR REPLACE VIEW SELECT case_order, case';
言うまでもなく、CREATE OR REPLACE は DDL ステートメントであるため、機能しなかったため、EXECUTE IMMEDIATE を使用する必要があります。

なにか提案を?前もって感謝します。

于 2012-11-14T16:23:06.510 に答える