是否有一种方法可以将已聚合为单独列的列分开?

问题描述 投票:0回答:2

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

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

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

是否有一种方法可以将它们与该函数分隔为单独的列,或者是否可以在没有LISTAGG的情况下使用函数来获得所需的结果?

sql oracle oracle-sqldeveloper delimiter
2个回答
0
投票

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

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;

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


0
投票

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

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

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

处理类似需求的常见方法是编写一个查询,以单个行的形式返回当前在LISTAGG中的数据,并使用报告(例如Qlik或OBIEE或能够在其前端进行交叉表或数据透视的任何东西) 。

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

© www.soinside.com 2019 - 2024. All rights reserved.