Oracle - 在PIVOT中聚合CLOB

时间:2017-10-02 14:09:35

标签: oracle pivot aggregate-functions clob 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

我试图调整这些数据,但我无法使其工作,因为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') )

但它产生了

  

缓冲区太小,无法CLOBCHARBLOBRAW转换   错误

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和其他聚合函数,但它们只接受数字作为输入。

有关如何透视这些数据的任何建议吗?

0 个答案:

没有答案