【问题标题】:listagg in SQL to group rows in to one rowSQL中的listagg将行分组为一行
【发布时间】:2016-05-27 05:51:11
【问题描述】:

我有一个如下所示的表 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 的状态为 null 以显示

我使用的查询

 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'。请帮助我。谢谢

【问题讨论】:

  • 您有什么没有告诉我们的吗?如果您在执行查询时没有收到错误消息,我会感到非常惊讶。您正在按名称分组,但尝试显示未聚合的字段,例如 water-access 而不是 min(water-access)max(water-access) 等。
  • @ThorstenKettner.sry 我已经更新了问题。请帮助我
  • 使用 Tim 的查询。将LISTAGG(Role, ',') 替换为LISTAGG(CASE WHEN F1 = 'yes' THEN Role END, ',') 以便仅在F1 为yes 时向字符串添加角色。

标签: sql oracle11g listagg


【解决方案1】:

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

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

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

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

【讨论】:

    【解决方案2】:

    试试这个...

     select * from table_name pivot(sum(name) for role
    

    【讨论】:

      猜你喜欢
      • 2020-06-21
      • 2021-03-26
      • 2022-10-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-05-10
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多