2015-05-04 3 views
1

У меня есть таблица, которая имеет следующую структуру и образец данных:Oracle SQL Cross Tab Query

ITEM LOC STOCK 
0001 KS5 10 
0001 KS6 30 
0002 KS5 10 
0002 KS6 20 

Мне нужно запросить перекрестное вкладку, так что я получаю

ITEM KS5 KS6 
0001 10 30 
0002 10 20 

от ЛСС (KS5 и KS6) может меняться, и можно добавлять новые местоположения.

Как я могу получить желаемый результат?

+1

Это называется поворот, не так ли? –

ответ

1

Для динамически генерируемых результатов вам нужно некоторое динамическое решение PLSQL, что-то вроде этой процедуры, создавая вид v_list_loc:

create or replace procedure p_list_loc is 

    v_sql varchar2(32000) := ''; 

begin 

    for c in (select distinct loc from test order by loc) loop 
    v_sql := v_sql || '''' ||c.loc|| ''' '||c.loc||','; 
    end loop; 

    v_sql := 'create or replace view v_list_loc as ' 
    ||'select * from (select item, loc, stock from test) pivot (sum(stock) ' 
    ||'for (loc) in ('||rtrim(v_sql, ',')||'))'; 

    execute immediate v_sql; 

end p_list_loc; 

В коде процедуры замены test с вашим именем таблицы. Обобщение этой процедуры запуска и выбрать результаты из сгенерированного зрения v_list_loc:

SQL> exec p_list_loc; 

PL/SQL procedure successfully completed 

SQL> select * from v_list_loc; 

ITEM   KS5  KS6 
----- ---------- ---------- 
0001   10   30 
0002   10   20 

Каждый раз, когда новые значения в столбце loc появляется необходимо выполнить процедуру, прежде чем выбрать из поля зрения.

1

Пожалуйста, попробуйте этот запрос.

SELECT * 
FROM (SELECT ITEM ,LOC ,STOCK 
     FROM TABLE_NAME) 
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN ('KS5' , 'KS6')) 
ORDER BY ITEM; 

С уважением.

+0

Hi Florin, Спасибо. Есть ли способ, который вместо указания KS5 и KS6, я пишу подзапрос, который будет динамически выбирать местоположения, поскольку новые местоположения также будут добавлены позже. –