2015-05-04 122 views
1

我有一個具有以下結構和樣本數據表:的Oracle SQL交叉表查詢

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

我需要查詢交叉表,讓我得到

ITEM KS5 KS6 
0001 10 30 
0002 10 20 

的LOC(KS5和KS6)可以變化,並且可以添加新的位置。

我怎樣才能得到想要的結果?

+1

它被稱爲pivoting,不是嗎? –

回答

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

嗨弗洛林, 謝謝。 有沒有什麼辦法,而不是指定KS5和KS6,我寫了一個子查詢,將動態地選擇位置,因爲新的位置也將在稍後添加。 –