有人可以澄清我对oracle中数据透视表的怀疑

时间:2013-08-08 07:14:00

标签: oracle oracle11g pivot

在输入表中,键和值是列名。下面是输入表,我想在这个o / p格式下面的表,但数据不是 来...当我们可以%方括号中的符号而不使用时 在查询中显示数据然后显示数据。但我在枢轴中使用相同的数据 它显示空白。帮助我如何使用%符号和类似运算符 在透视查询中提前感谢。

输入表:

key      value 
-------------------
sal[0]    2000 
sal[1]    3000 
sal[2]    1000 
emp[0]    10 
emp[1]    20 
emp[2]    30 
ename[0]  rag 
ename[1]  swa 
ename[2]  yag

输出格式:

  emp   ename sal
  ---------------- 
  10    rag   2000 
  20    swa   3000 
  30    yag   1000 

我的查询是:

 SELECT * 
   FROM INPUT 
 PIVOT (
    MAX (VALUE) FOR KEY IN ('EMP[%]' AS EMP,
                            'ENAME[%]' AS ENAME,
                            'SAL[%]' AS SAL
                            )
 );

1 个答案:

答案 0 :(得分:0)

IN子句的PIVOT子句中列出的值应该是常量值 枢轴列。虽然LIKE条件中的百分号符号被认为是 通配符,在IN子句的PIVOT子句中,它只是一个文字。

作为选项之一,我们可以摆脱那些方括号(除非它们携带 一些特殊的值)使用regexp_substr()正则表达式函数,然后执行数据透视:

SQL> with t1(key1, value1) as(
  2    select 'sal[0]'  ,  '2000'  from dual union all
  3    select 'sal[1]'  ,  '3000'  from dual union all
  4    select 'sal[2]'  ,  '1000'  from dual union all
  5    select 'emp[0]'  ,  '10'    from dual union all
  6    select 'emp[1]'  ,  '20'    from dual union all
  7    select 'emp[2]'  ,  '30'    from dual union all
  8    select 'ename[0]',  'rag'   from dual union all
  9    select 'ename[1]',  'swa'   from dual union all
 10    select 'ename[2]',  'yag'   from dual
 11  )
 12  select emp
 13       , sal
 14       , ename
 15    from ( select regexp_substr(key1, '^[[:alpha:]]+') as key1
 16                , value1
 17                , row_number() over(partition by regexp_substr(key1, '^[[:alpha:]]+') order by value1)
 18             from t1
 19          )
 20  pivot(
 21    max(value1) for  key1 in ('emp' as emp, 'sal' as sal, 'ename' as ename)
 22  )
 23  ;

结果:

EMP  SAL   ENAME
---- ----  -----
10   1000  rag
20   2000  swa
30   3000  yag