PL/SQL Oracle-将行动态转换为字段
我已经检查了相同的场景,但不幸的是仍然没有得到它:(,我尝试了一些代码,但仍然失败PL/SQL Oracle-将行动态转换为字段,sql,plsql,Sql,Plsql,我已经检查了相同的场景,但不幸的是仍然没有得到它:(,我尝试了一些代码,但仍然失败 将行动态转换为字段(字段取决于行数,行数取决于类型) 桌子 TYPE |ATTR_NAME | ATTR_VALUE **sample flat rate |Activity | N **sample flat rate |code | PLAN_999 **sample flat ra
- 将行动态转换为字段(字段取决于行数,行数取决于类型)
TYPE |ATTR_NAME | ATTR_VALUE
**sample flat rate |Activity | N
**sample flat rate |code | PLAN_999
**sample flat rate |codes object | object
**sample low rate |Activity | Y
**sample low rate |code | PLAN_1299
**sample low rate |codes object | charge
**sample low rate |indicator | 0
代码:
declare
sqlqry VARCHAR2(4001);
cols VARCHAR2(4001);
begin
select listagg('''' || ATTR_NAME || ''' as "' || ATTR_NAME || '"', ',') within group (order by ATTR_NAME)
into cols
from (select distinct ATTR_NAME from temp_2);
sqlqry :=
'select * from
(
select *
from temp_2
)
pivot
(
MIN(ATTR_VALUE) for ATTR_NAME in (' || cols || ')
)'
;
使用一个表,如下所示:
create table temp_2 (TYPE, ATTR_NAME, ATTR_VALUE) as (
select 'sample flat rate', 'Activity' , 'N' from dual union all
select 'sample flat rate', 'code' , 'PLAN_999' from dual union all
select 'sample flat rate', 'codes object', 'object' from dual union all
select 'sample low rate', 'Activity' , 'Y' from dual union all
select 'sample low rate', 'code' , 'PLAN_1299' from dual union all
select 'sample low rate', 'codes object', 'charge' from dual union all
select 'sample low rate', 'indicator' , '0' from dual
)
这是一个工作示例:
SQL> variable x refcursor
SQL>
SQL> declare
2 sqlqry VARCHAR2(4001);
3 cols VARCHAR2(4001);
4 begin
5 select listagg('''' || ATTR_NAME || ''' as "' || ATTR_NAME || '"', ',') within group (order by ATTR_NAME)
6 into cols
7 from (select distinct ATTR_NAME from temp_2);
8 sqlqry :=
9 'select * from
10 (
11 select *
12 from temp_2
13 )
14 pivot
15 (
16 MIN(ATTR_VALUE) for ATTR_NAME in (' || cols || ')
17 )';
18 open :x for sqlqry;
19 end;
20 /
PL/SQL procedure successfully completed.
SQL> print :x
TYPE Activity code codes obj indicator
---------------- --------- --------- --------- ---------
sample low rate Y PLAN_1299 charge 0
sample flat rate N PLAN_999 object
SQL>
也许可以useful@Aleksej…谢谢..我成功地执行了PL/SQL,但在执行结果变量x ref cursor exec dynamic_pivot(:x)print x时出错;请发布您尝试过的内容和遇到的错误;这将帮助人们更好地理解这个问题并给出一个很好的答案抱歉:)Bind变量“x”不是宣布而是做什么?。。。您发布的内容中没有X:)@Aleksej..很抱歉造成混淆。。我们只有一张桌子。。临时工2。。我已经更新了上面的代码。它工作正常,但当我在我的真实表格中运行它时,它只显示了3个字段。。。可能真正的表有15行。。因此,这意味着应该显示15个“字段”。如果我根据其中的行数更改不同的类型,也应该等于要显示的字段数,如果我按类型筛选,则从temp_2中选择distinct ATTR_NAME,其中TYPE=“采样低速率”。。结果不会被过滤