Oracle SQL 交叉表查询

Oracle SQL Cross Tab Query

我有一个 table,它具有以下结构和示例数据:

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)可能会有所不同,并且可以添加新的位置。

怎样才能得到想要的结果?

请尝试这个查询。

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

此致。

对于动态生成的结果,您需要一些动态 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 替换为您的 table 名称。编译此过程,运行 和 select 结果来自生成的视图 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 从视图中查看之前执行过程。

尝试修改 SQL 如下:

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