【问题标题】:PL/SQL Oracle - convert rows into fields dynamicallyPL/SQL Oracle - 将行动态转换为字段
【发布时间】:2018-07-25 22:14:02
【问题描述】:

我已经检查过这样的相同场景,但不幸的是仍然没有得到它:(,我尝试了一些代码但仍然无法工作

  • 动态将行转换为字段(字段取决于行数,行数取决于类型)

表格

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  || ')    
)'
;

【问题讨论】:

  • 也许this 有用
  • @Aleksej .. 谢谢 .. 我成功执行了 PL/SQL 但在执行结果变量 x ref cursor exec dynamic_pivot(:x) print x; 时出错
  • 请发布您尝试过的内容和遇到的错误;这将帮助人们更好地理解问题并给你一个很好的答案
  • 抱歉 :) 绑定变量“X”未声明
  • 但是在做什么?...您发布的内容中没有 X :)

标签: sql plsql


【解决方案1】:

如下表:

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>

【讨论】:

  • @Aleksej.. 很抱歉造成混乱.. 我们只有一张桌子.. Temp_2.. 我已经更新了上面的代码..
  • 它工作正常,但是当我在我的真实表中运行它时它只显示 3 个字段......可能真实表有 15 行......所以意味着应该显示 15 个“字段”......如果我根据其中的行数更改不同的 TYPE 也应该等于要显示的字段数
  • 如果我按类型过滤它,从 temp_2 中选择不同的 ATTR_NAME 其中 type = 'sample low rate' .. 结果未被过滤
猜你喜欢
  • 2019-09-11
  • 2015-09-16
  • 1970-01-01
  • 2021-08-07
  • 2017-06-03
  • 2021-11-24
  • 2015-12-13
  • 2013-08-16
  • 1970-01-01
相关资源
最近更新 更多