我拥有包含其位置权限和这些权限组的大型用户数据。我需要为每个用户做一个只包含1行的报告。
每个用户在一组中拥有如此多的权限,我需要使用自己的聚合函数LISTAGG_CLOB
来生成聚合列表但返回CLOB
(超过4000个字符)。
此查询为我提供了具有权限的所有用户的列表,但它为每组用户创建了一行。
select u.NAME,
lpg.NAME,
LISTAGG_CLOB(l.NAME)
from USERS u
left join LOCATION_PERM lp
on lp.USER_ID = u.ID
left join LOCATION l
on l.ID = lp.LOCATION
left join LOCATION_PERM_GROUP lpg
on lpg.ID = lp.GROUP
group by u.NAME, lpg.NAME
我试图调整这些数据,但我无法使其工作,因为Oracle不会将我自己的聚合函数识别为聚合函数而且没有聚合函数(除了LISTAGG
之外也是如此)小)意味着聚合字符串。
我尝试的样本是:
1)
select * from (
select u.NAME as USER,
lpg.NAME as PERM_GROUP,
LISTAGG_CLOB(l.NAME) as PERMISSIONS
from USERS u
left join LOCATION_PERM lp
on lp.USER_ID = u.ID
left join LOCATION l
on l.ID = lp.LOCATION
left join LOCATION_PERM_GROUP lpg
on lpg.ID = lp.GROUP
group by u.NAME, lpg.NAME)
pivot (LISTAGG(PERMISSIONS) within group (order by PERMISSIONS) for PERM_GROUP in ('Global', 'Orders', 'Admin') )
但它产生了
缓冲区太小,无法
CLOB
到CHAR
或BLOB
到RAW
转换 错误
2)
select * from (
select u.NAME as USER,
lpg.NAME as PERM_GROUP,
LISTAGG_CLOB(l.NAME) as PERMISSIONS
from USERS u
left join LOCATION_PERM lp
on lp.USER_ID = u.ID
left join LOCATION l
on l.ID = lp.LOCATION
left join LOCATION_PERM_GROUP lpg
on lpg.ID = lp.GROUP
group by u.NAME, lpg.NAME)
pivot (DISTINCT(PERMISSIONS) for PERM_GROUP in ('Global', 'Orders', 'Admin') )
但它说"缺少表情"所以我想我不能使用DISTINCT
(或UNIQUE
)关键字代替聚合函数。
我还尝试了MAX
和其他聚合函数,但它们只接受数字作为输入。
有关如何透视这些数据的任何建议吗?