【问题标题】:Dynamically pivoting a table Oracle动态旋转表 Oracle
【发布时间】:2012-10-15 23:23:55
【问题描述】:

我有一张如下所示的表格:

C_ID   P_ID   KEY    VALUE
null   null   KEY1   VALUE1
null   null   KEY2   VALUE2
null   null   KEY3   VALUE3
2       2     KEY4   VALUE4
2       3     KEY5   VALUE5

我想得到这个结果表/视图:

C_ID   P_ID   KEY1    KEY2    KEY3      KEY4    KEY5
NULL   NULL  VALUE1  VALUE2  VALUE3     NULL    NULL
2       2     NULL    NULL    NULL     VALUE4   NULL
2       3     NULL    NULL    NULL      NULL   VALUE5

有没有人知道我该如何实现这一目标? 我试过了:

select * from (select c_id, p_id, r_key, r_value from s_projectroles) pivot (max(r_value) for r_key in (any));

我遇到了一个错误:

ORA-00936: Ausdruck fehlt
00936. 00000 -  "missing expression"

【问题讨论】:

    标签: oracle pivot


    【解决方案1】:

    这可以通过以下方式动态完成。首先,这是查询的静态版本,因此您可以看到最终的 sql:

    select c_id,
      p_id,
      max(case when r_key= 'KEY1' then r_value  end) KEY1,
      max(case when r_key= 'KEY2' then r_value  end) KEY2,
      max(case when r_key= 'KEY3' then r_value  end) KEY3,
      max(case when r_key= 'KEY4' then r_value  end) KEY4,
      max(case when r_key= 'KEY5' then r_value  end) KEY5
    from s_projectroles
    group by c_id, p_id
    

    SQL Fiddle with Demo

    然后要动态执行此操作,您可以创建以下过程:

    CREATE OR REPLACE procedure dynamic_pivot(p_cursor in out sys_refcursor)
    as
        sql_query varchar2(1000) := 'select c_id, P_id ';
    
        begin
            for x in (select distinct r_key from s_projectroles order by 1)
            loop
                sql_query := sql_query ||
                  ' , max(case when r_key = '''||x.r_key||''' then r_value end) as '||x.r_key;
    
                    dbms_output.put_line(sql_query);
            end loop;
    
            sql_query := sql_query || ' from s_projectroles group by c_id, p_id';
    
            open p_cursor for sql_query;
        end;
    /
    

    然后执行它:

    variable x refcursor
    exec dynamic_pivot(:x)
    print x
    

    结果是一样的:

    |   C_ID |   P_ID |   KEY1 |   KEY2 |   KEY3 |   KEY4 |   KEY5 |
    ----------------------------------------------------------------
    | (null) | (null) | VALUE1 | VALUE2 | VALUE3 | (null) | (null) |
    |      2 |      2 | (null) | (null) | (null) | VALUE4 | (null) |
    |      2 |      3 | (null) | (null) | (null) | (null) | VALUE5 |
    

    【讨论】:

    • 嗨,bluefeet,虽然有点晚了,但无论如何。我以类似的方式解决了。你的回答是正确的。谢谢
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-06-24
    • 1970-01-01
    • 1970-01-01
    • 2019-10-06
    • 2020-03-11
    • 2015-06-24
    • 1970-01-01
    相关资源
    最近更新 更多