在oracle中使用null列进行分组

时间:2016-12-20 13:18:54

标签: sql oracle

我想获得以逗号分隔的列值组,包括按列分组的Null值。分组将NUll值视为 分开的小组。

我们说有一个input_table:

+----------------------------------------------------+
|      obj1      obj2       obj3      fail_msg       |
+----------------------------------------------------+
|                                                    |
|        A                               msg1        |
|        A          B            C       msg2        |
|        A          B            D       msg3        |
+----------------------------------------------------+

我想从输入表中获得如下结果。

结果:

----------------------------------
          A         B            C      msg1, msg2
          A         B            D      msg1, msg3   

与Listagg函数类似,但是使用Null值分组。

示例:

select LISTAGG(fail_msg, ', ') WITHIN GROUP(ORDER BY fail_msg) failure_ message
    from input_table group by  obj1, obj2, obj3  

但是这个查询没有合并listagg()

中的空值

任何人都可以帮助我吗?

提前致谢。

2 个答案:

答案 0 :(得分:0)

这是非常糟糕的代码,但似乎可以满足您的需求:

#/login

答案 1 :(得分:0)

无论你做什么,单独

GROUP BY都不会产生这个结果,因为它将每一行分配给一个且只有一个组。 (有一些方法可以在一个查询中获取摘要行或多个分组集,但仍然有些人在这里没有帮助......)

你可以在SQL之外更容易地做到这一点;但如果您必须在查询中执行此操作,那么您可以尝试以下方法。

请注意,此查询对您提供的示例足够好;如果您的实际要求更复杂,您可能需要扩展这些基本想法。另请注意,我会逐步显示逻辑以获得清晰的解释,但只是最后一个查询是您想要的:

首先,我们可以获得具有NULL值的消息列表。

select *
  from input_table
 where obj2 is NULL
   and obj3 is NULL

我们需要将其与给定obj2值存在的obj3obj1值列表相关联;这是为了创建要在每个组中应用的单个消息记录。

select null_list.obj1, obj_list.obj2, obj_list.obj3, null_list.fail_msg
  from            input_table null_list
       inner join (select distinct obj1, obj2, obj3
                     from input_table) as obj_list
               on null_list.obj1 = obj_list.obj1

现在将它与没有空值的消息列表结合起来

select null_list.obj1, obj_list.obj2, obj_list.obj3, null_list.fail_msg
  from            input_table null_list
       inner join (select distinct obj1, obj2, obj3
                     from input_table) as obj_list
               on null_list.obj1 = obj_list.obj1
UNION ALL
select *
  from input_table
 where obj2 is not null
   and obj3 is not null

(请注意,上面只处理obj2和obj3都为空或者都不为空的记录。这是我只讨论示例的一部分,你需要添加更多的逻辑如果你需要处理列的不同组合为空。这可能会变得很乱;就像我说的那样,SQL并不是真正这个工作的工具。)

现在你把它作为一个应用于obj1,obj2,obj3的特定组合的消息列表,一个简单的LILSTAGG可以让你完成剩下的工作。