动态旋转

时间:2012-11-06 22:28:22

标签: oracle11g plsqldeveloper oracle-sqldeveloper

我希望能得到一些需要调整的视图的帮助,但我不确定。     视图采用以下格式:

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。它必须是动态的......

1 个答案:

答案 0 :(得分: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 case_1 10 80 15 84
2 case_2 13 65 20 90
3 case_3 17 70 7 72

现在的事情不是打印我想将它存储在视图中的结果。我如何实现这一目标?我试着修改这条线 l_query LONG:='SELECT case_order,case';

l_query LONG:='创建或替换视图选择case_order,case';
不用说它没有用,因为CREATE OR REPLACE是一个DDL语句,所以我必须使用EXECUTE IMMEDIATE。

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