динамический поворот

Я надеюсь получить некоторую помощь в представлении, которое нужно повернуть, хотя я не уверен. Представление имеет следующий формат:

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. Он должен быть динамичным...


person user1804548    schedule 06.11.2012    source источник
comment
Есть несколько очень хороших результатов, если вы просто погуглите для динамического поворота оракула. Вы пробовали что-нибудь?   -  person Mat    schedule 07.11.2012
comment
Я, конечно, осмотрелся, прежде чем опубликовать свое сообщение. Как я сказал в своем исходном посте, мой текущий рабочий код использует жестко запрограммированные имена для управления, но они могут время от времени меняться, поэтому я хочу сделать его динамическим, чего я еще не понял. Можете ли вы предложить какое-то решение.   -  person user1804548    schedule 07.11.2012
comment
Дело в том, что если вы погуглите именно динамическую сводку оракула, вы найдете статью asktom, в которой описывается вариант динамической сводки. Вы пробовали? Разве это не вариант?   -  person Mat    schedule 07.11.2012


Ответы (1)


Спасибо за ваше предложение, я понял это. На самом деле в блоге Тома Кайта есть аналогичный ответ (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  

ДЕЛО ДЕЛО_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 := 'CREATE OR REPLACE VIEW SELECT case_order, case';
Излишне говорить, что это не сработало, потому что CREATE OR REPLACE — это оператор DDL, поэтому мне приходится использовать EXECUTE IMMEDIATE.

Любое предложение? Заранее спасибо.

person user1804548    schedule 14.11.2012