有没有一种方法可以将已聚合到单独列中的列分开?

时间:2020-02-20 16:08:53

标签: sql oracle oracle-sqldeveloper delimiter

我的SQL查询当前正在使用LISTAGG将表列中的所有行数据提取为一列。 我使用LISTAGG的原因是因为该列中可以有无限数量的行。

我希望将这些行中的每行放入一个单独的列中,以便能够运行报告。这是我当前的LISTAGG函数:

 LISTAGG(CE1.DX_NAME, ' ; ') WITHIN GROUP (ORDER BY CE1.DX_NAME) AS DIAGNOSES 

是否有一种方法可以将它们与该函数分隔为单独的列,或者是否可以使用不带LISTAGG的函数来获得所需结果的任何建议?

2 个答案:

答案 0 :(得分:1)

您通常可以使用条件聚合来执行所需的操作-但您需要知道最大列数:

select grp,
       max(case when seqnum = 1 then col end) as col_1,
       max(case when seqnum = 2 then col end) as col_2,
       max(case when seqnum = 3 then col end) as col_3
from (select t.*,
             row_number() over (partition by grp order by col) as seqnum
      from t
     ) t
group by grp;

您的问题缺少细节,但这显示了此类查询的一般结构。

答案 1 :(得分:1)

...因为该列中的行数不受限制

对于任何查询,在解析查询时,Oracle必须能够确定结果集中的列数以及每一列的名称和数据类型。因此,没有合理的方法来提交查询,该查询将返回具有任意数据驱动列数的结果集。 (有关“不合理”且非常酷的方法,请参见:https://technology.amis.nl/2006/05/24/dynamic-sql-pivoting-stealing-antons-thunder/)。

很多限制与回答这个问题有关:假设您可以提交一个具有任意数据驱动的列数的查询,您如何期望调用者处理这样的结果集?

处理诸如您这样的需求的一种常见方法是编写一个查询,以单个行的形式返回当前LISTAGG中的数据,并使用报告,例如Qlik或OBIEE或任何能够进行交叉表分析或枢转的他们的前端。

另一种常见方法是对列数进行硬性限制。例如,如果您知道数据永远不会超过30列,则可以使用Gordon的条件汇总(请参阅他的答案)。

相关问题