我有一个场景。我需要在两列中使用listagg
,以逗号分隔数据。我在查询中有别名,因此我不能使用listagg中必需的group by
。为了解决这个问题,我在外部查询中使用输出,并在那里使用listagg并对列进行分组。
问题是我的数据是按不在select
子句中的列排序的。如何在外部查询中维护内部查询的数据顺序。
或者
是否有可能使外部查询中的列用于排序,而不是在select
子句中使用。
我的查询就像
select A+10 AA,
B*20 BB,
CC ,
DD
from Tab1 order by M;
当我使用listagg时,我修改了查询
select
AA,
BB
listagg(CC,',') within group(order by CC),
listagg(DD,',') within group(order by DD)
from
(
select A+10 AA,
B*20 BB,
CC ,
DD
from Tab1 order by M
)
group by AA,BB
如果您可以清楚地看到,我们的内部查询被select子句中没有的M列烦恼。如何在不接受外部查询的情况下维持order by M
,或者如果我在外部查询中采用M列,那么如何排除结果。
或者当我有别名时,是否有可能在内部查询中使用listagg
答案 0 :(得分:1)
您可以在分组时使用别名,也可以使用未显示的列进行排序。
唯一的限制是,当不按分组时,需要汇总要排序的列(sum
,max
,min
等)。
with testtab as (
select 1 "AA", 10 "BB", 'aval1' "CC", 'bval1' "DD", 5 "SORTV" from dual
union all select 2, 10, 'aval2', 'bval2', 4 "SORTV" from dual
union all select 2, 30, 'aval3', 'bval3', 3 "SORTV" from dual
union all select 4, 40, 'aval4', 'bval4', 2 "SORTV" from dual
union all select 4, 40, 'aval5', 'bval5', 1 "SORTV" from dual)
select aa + 10 as "AA",
bb * 20 as "BB",
listagg(cc, ', ') within group (order by cc),
listagg(dd, ', ') within group (order by dd)
from testtab
group by aa, bb
order by max(SORTV) asc
收益
AA BB LISTAGG(CC,',')WITHINGROUP(ORDERBYCC) LISTAGG(DD,',')WITHINGROUP(ORDERBYDD)
---------------------------------------------------------------------------------------
14 800 aval4, aval5 bval4, bval5
12 600 aval3 bval3
12 200 aval2 bval2
11 200 aval1 bval1