【问题标题】:Oracle SQL Cross Tab QueryOracle SQL 交叉表查询
【发布时间】:2015-07-13 11:05:53
【问题描述】:

我有一张表,其结构和样本数据如下:

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

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

【问题讨论】:

  • 这叫旋转,不是吗?

标签: sql oracle oracle11g report crosstab


【解决方案1】:

请试试这个查询。

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,而是编写一个子查询来动态选择位置,因为以后还会添加新位置。
【解决方案2】:

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

【讨论】:

    【解决方案3】:

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

    【讨论】:

      猜你喜欢
      • 2014-10-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-04-07
      • 2014-04-01
      • 2012-06-22
      • 1970-01-01
      相关资源
      最近更新 更多