2015-05-04 125 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,我写了一个子查询,将动态地选择位置,因为新的位置也将在稍后添加。 –