唉,PIVOT操作符不适用于listag,因此您仍然需要使用旧的数据透视方法(条件聚合)。但您可以简化查询,如下所示。
注意:在示例数据中,第一列名为USER\u ID,值为“john”,但随后有一个名为USER\u ID,值为“abc123”的属性。这毫无意义。我在输出中使用了NEW\u USER\u ID的列名,但我希望在现实生活中你不必忍受这种胡说八道。
您在下面看到的WITH子句不是解决方案的一部分;我把它包括进来只是为了测试。删除它,然后在其余的查询中,在所有地方使用实际的表名和列名。
with
inputs ( user_id, attr_name, attr_value ) as (
select 'joe', 'user_id' , 'abc123' from dual union all
select 'joe', 'permission', 'A' from dual union all
select 'joe', 'permission', 'B' from dual union all
select 'joe', 'permission', 'C' from dual
)
select user_id,
min(case attr_name when 'user_id' then attr_value end) as new_user_id,
listagg(case attr_name when 'permission' then attr_value end, ', ')
within group (order by attr_value) as permission_list
from inputs
where attr_name in ('user_id', 'permission')
and user_id = 'joe' -- if needed
group by user_id
;
USER_ID NEW_USER_ID PERMISSION_LIST
------------ ------------ ------------------
joe abc123 A, B, C