如何通过 Oracle SQL 使用 PIVOT XML 和子查询

问题描述 投票:0回答:1

我使用的是 Oracle 21C。 我有一个从 3 个表中进行选择的查询,并且可以很好地处理“硬编码”日期。

Select * from 
(   Select
      vc.last_name
    , vc.first_name  
    , va.attendance_type
    , ve.event_date 
    From
      VOL_CONTACT vc
    , VOL_ATTENDANCE va
    , VOL_EVENT ve
    Where
      va.contact_fkey = vc.prim_key
    And va.event_fkey = ve.prim_key
)
    pivot
    ( max(attendance_type)
      for event_date in ('30-mar-2023','18-apr-2023')
    )

但是,日期需要是动态的。 我尝试将 PIVOT XML 与子查询一起使用。 最后四行改为:

pivot xml
( max(attendance_type)
 for event_date in (select distinct to_char(event_date, 'dd-mon-yy') from vol_event)
)

。 它们可以很好地显示 LAST_NAME 和 FIRST_NAME 值。 但是,第三列的列标题是“EVENT_DATE_XML”,每行的该列的值是“(XMLTYPE)”。 如何使 PIVOT XML 与子查询一起使用?

pivot
1个回答
0
投票

根据更有经验的开发人员的意见,我采用了另一种方法。 使用 Apex 标准报告,我将以下内容用于报告区域/源(类型=返回 PL/SQL 的函数体)

declare
    l_pivot_cols varchar2(4000);
    l_sql        clob := q'{
select
    *
from
    (select
        vc.last_name
      , va.attendance_type
      , ve.event_date
    from
        vol_attendance va
            full outer join vol_event ve
              on va.event_fkey = ve.prim_key
            full outer join vol_contact vc
              on va.contact_fkey = vc.prim_key
            full outer join vol_contact_ministry vcm
              on vcm.contact_fkey = vc.prim_key
            full outer join vol_ministry vm
              on vm.prim_key = vcm.ministry_fkey
    where
        vm.ministry = 'Refugee'
    and vc.status = 'Active'
    )
pivot (
    max(attendance_type) for event_date in (%s))
order by
    last_name
}';

begin
    select
      listagg(apex_string.format('date ''%0'' "%0"', to_char(event_date, 'YYYY-MM-DD')), ', ') 
        within group (order by event_date)
    into
      l_pivot_cols
    from
      vol_event;
    return apex_string.format(l_sql, l_pivot_cols);
end;

然后,对于属性/标题(类型=PL/SQL 函数体)我使用:

declare
  l_cols varchar2(4000);

begin
  select
      listagg(to_char(event_date, 'Mon-dd-yy'), ':') within group (order by event_date)
  into
      l_cols
  from
      vol_event
;
  return 'Last Name:' || l_cols;
end;

效果很好。

© www.soinside.com 2019 - 2024. All rights reserved.