2

我有一个如下所示的表 1

Name  role       F1     status1 status 2 
sam   player     yes      null   null
sam   admin      yes     null    null
sam   guest       no      x       x

我希望结果是

Name  role         status1 status 2 
  sam admin,player    x       x

我已经对 list_agg 中的角色进行了查询。但是当 F1='yes' 时,sam 的状态为空

我使用的查询

 select name,list_agg(role,',') within group(order by name),max(status1),max(status2)
from table 1 where F1='yes'
group by name 

但我得到这样的东西

name role          status1   status2 
sam  admin,player     null      null

我希望仅在角色列上工作的位置和 max(status1) 处于 status1 即'x'。请帮助我。谢谢

4

2 回答 2

2

您可以尝试LISTAGG()GROUP BY查询中使用:

SELECT Name,
    LISTAGG(Role, ',') WITHIN GROUP (ORDER BY Role) "Role"
    MAX(CASE WHEN water_access = 'Y' THEN 'Y' ELSE NULL END) "water_access",
    MAX(CASE WHEN food_access = 'Y'  THEN 'Y' ELSE NULL END) "food_access",
    MAX(CASE WHEN power_access = 'Y' THEN 'Y' ELSE NULL END) "power_access"
FROM yourTable
GROUP BY Name
ORDER BY Name DESC

请注意,我选择Name使用 对每个组的聚合进行排序Role,因为您没有向我们提供任何可以给出您在预期输出中显示的排序的列。

第二个注意事项:MAX()在Oracle 中忽略了NULL值,因此可以在pivot 中使用它来正确识别Y您想要出现的值。

于 2016-05-27T06:00:39.513 回答
1

试试这个...

 select * from table_name pivot(sum(name) for role
于 2016-05-27T06:00:20.977 回答