我想获得以逗号分隔的列值组,包括按列分组的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()
中的空值任何人都可以帮助我吗?
提前致谢。
答案 0 :(得分:0)
这是非常糟糕的代码,但似乎可以满足您的需求:
#/login
答案 1 :(得分:0)
GROUP BY
都不会产生这个结果,因为它将每一行分配给一个且只有一个组。 (有一些方法可以在一个查询中获取摘要行或多个分组集,但仍然有些人在这里没有帮助......)
你可以在SQL之外更容易地做到这一点;但如果您必须在查询中执行此操作,那么您可以尝试以下方法。
请注意,此查询对您提供的示例足够好;如果您的实际要求更复杂,您可能需要扩展这些基本想法。另请注意,我会逐步显示逻辑以获得清晰的解释,但只是最后一个查询是您想要的:
首先,我们可以获得具有NULL值的消息列表。
select *
from input_table
where obj2 is NULL
and obj3 is NULL
我们需要将其与给定obj2
值存在的obj3
和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
现在将它与没有空值的消息列表结合起来
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可以让你完成剩下的工作。