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_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';
使用
l_query LONG := 'CREATE OR REPLACE VIEW SELECT case_order, case';
不用说它不起作用,因为 CREATE OR REPLACE 是一个 DDL 语句,所以我必须如何使用 EXECUTE IMMEDIATE。

有什么建议吗?提前致谢。

于 2012-11-14T16:23:06.510 回答