有没有办法将已聚合为单独列的列分开?

Is there a way to separate a column that has been aggregated into individual columns?

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

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

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

有没有办法将它们从这个函数中分离到单独的列中,或者关于我是否可以使用没有 LISTAGG 的函数来获得我想要的结果的任何建议?

您通常可以使用条件聚合来做您想做的事 -- 但您需要知道最大列数:

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;

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

... because there can be an unlimited amount of rows in the column

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

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

处理像您这样的要求的一种常见方法是编写一个查询,将 return 当前在您的 LISTAGG 中的数据作为单独的行,并使用像 Qlik 或 OBIEE 或其他任何报告能够在其前端进行交叉表或数据透视表。

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