我使用的是 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 与子查询一起使用?
根据更有经验的开发人员的意见,我采用了另一种方法。 使用 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;
效果很好。