gpt4 book ai didi

oracle - 动态旋转表 Oracle

转载 作者:行者123 更新时间:2023-12-01 08:34:37 26 4
gpt4 key购买 nike

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

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

我想得到这个结果表/ View :

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"

最佳答案

这可以通过以下方式动态完成。首先,这是查询的静态版本,因此您可以看到最终的 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 |

关于oracle - 动态旋转表 Oracle,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13074319/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com