有没有办法将已聚合为单独列的列分开?
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 的条件聚合(参见他的回答)。
我的 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 的条件聚合(参见他的回答)。