Oracle SQL 交叉表查询

3

我有一个表格,其结构和示例数据如下:

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) 可以变化,也可以添加新的位置。

我该如何获得所需的结果?


2
这被称为“数据透视”,对吧? - Florin Ghita
3个回答

2
请尝试执行此查询。
SELECT *
FROM   (SELECT ITEM ,LOC ,STOCK
        FROM   TABLE_NAME)
PIVOT  (SUM(STOCK) FOR (LOC) IN ('KS5' , 'KS6'))
ORDER BY ITEM;

敬礼。


嗨,Florin, 谢谢。有没有办法,我可以编写一个子查询来动态选择位置,而不是指定KS5和KS6,因为以后可能会添加新的位置。 - Imran Hemani

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 中出现新值时,您需要在从视图中选择之前执行该过程。

0
尝试并修改以下 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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接