Ark*_*ler 5 oracle pivot clob aggregate-functions listagg
我有包含他们的位置权限和这些权限组的大量用户数据。我需要为每个用户做一个只包含 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
Run Code Online (Sandbox Code Playgroud)
我试图对这些数据进行透视,但我无法让它工作,因为 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') )
Run Code Online (Sandbox Code Playgroud)
但它产生
缓冲区太小导致
CLOBtoCHAR或BLOBtoRAW转换错误
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') )
Run Code Online (Sandbox Code Playgroud)
但它说“缺少表达式”,所以我想我不能使用DISTINCT(or UNIQUE) 关键字代替聚合函数。我也尝试过MAX和其他聚合函数,但它们只接受数字作为输入。
任何建议如何旋转这些数据?