Oracle 分组后取值练习

41 阅读1分钟

需求

现在有一数据表,默认设有四列:

分别为id用户编号,unit单位名称,status角色状态(0为拥有权限,1为取消了权限),data为角色名称

需要获取所有员工的所有角色权限,

此外,如果一个员工所有角色权限都被取消了(拥有的所有角色状态都为1),那就统计出曾经拥有的所有权限

image.png

例如上图,用户编号为3的员工,现在在u1部门,曾经角色为Assitant,但是被取消了,现在只有HR和Servant角色权限

查询sql

select ID,UNIT,STATUS,ROLE 
from (select id,unit,status,
     listagg(data,'、') within group (order by id,unit,status) over(partition by id,unit,status) as role,
     row_number() over(partition by id,unit order by id,unit,status) as rn
    from mygroup 
     )
where rn = 1

执行后可以看到,id为3的用户,只查询到了状态为0的角色信息;

而id为4的用户由于全部权限都被取消,所以展示了所有被取消的权限集合

image.png

参考

使用oracle内置函数合并多行数据为一行_oracle多行合并函数-CSDN博客