Oracle SQL交叉标签查询

0s7z1bwu  于 2023-04-29  发布在  Oracle
关注(0)|答案(3)|浏览(167)

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

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)可以变化,并且可以添加新的位置。
我怎样才能得到想要的结果?

tkclm6bt

tkclm6bt1#

请尝试此查询。

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

问候。

tez616oj

tez616oj2#

对于动态生成的结果,您需要一些动态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列中出现新值时,您需要在从视图中选择之前执行过程。

8iwquhpp

8iwquhpp3#

尝试修改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;

相关问题