我有一個具有以下結構和樣本數據表:的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)可以變化,並且可以添加新的位置。
我怎樣才能得到想要的結果?
我有一個具有以下結構和樣本數據表:的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)可以變化,並且可以添加新的位置。
我怎樣才能得到想要的結果?
動態生成的結果,你需要一些動態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
列新值出現,你需要從視圖中選擇之前執行程序每次。
請試試這個查詢。
SELECT *
FROM (SELECT ITEM ,LOC ,STOCK
FROM TABLE_NAME)
PIVOT (SUM(quantity) AS sum_quantity FOR (ITEM) IN ('KS5' , 'KS6'))
ORDER BY ITEM;
問候。
嗨弗洛林, 謝謝。 有沒有什麼辦法,而不是指定KS5和KS6,我寫了一個子查詢,將動態地選擇位置,因爲新的位置也將在稍後添加。 –
它被稱爲pivoting,不是嗎? –