我的SQL查询当前正在使用LISTAGG将表列中的所有行数据提取为一列。 我使用LISTAGG的原因是因为该列中可以有无限数量的行。
我希望将这些行中的每行放入一个单独的列中,以便能够运行报告。这是我当前的LISTAGG函数:
LISTAGG(CE1.DX_NAME, ' ; ') WITHIN GROUP (ORDER BY CE1.DX_NAME) AS DIAGNOSES
是否有一种方法可以将它们与该函数分隔为单独的列,或者是否可以使用不带LISTAGG的函数来获得所需结果的任何建议?
答案 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的条件汇总(请参阅他的答案)。