查询中有99列。大多数列都具有case
语句,因此它们具有别名。我必须在其中一列中使用listagg
。
我是否需要在其余98列中放入group by
?因为我们无法在group by
中使用别名,所以当列具有别名时如何分组?不使用listagg
就能使用group by
吗?
答案 0 :(得分:2)
Listagg
是一个聚合函数,因此如果没有GROUP BY
您将无法使用它。因为它是在别名之前处理的,所以您还必须意识到您无法在Listagg
语句本身中引用别名。不过,您可以做的是使用公用表表达式(CTE)格式化所有数据,然后按需要使用listagg
。
WITH temp_view AS ( SELECT … ) //Put your aliased statements in here
SELECT field1, field2, listagg(...) AS field3
FROM temp_view GROUP BY field1, field2
问题的下一部分是,您将必须对所有选择的字段使用GROUP BY。但是,如果这99个字段不是表中主键的唯一值,则可以使用另一个CTE来listagg
仅保留函数所需的数据,然后将其重新加入主查询中。>
这是一个普遍的失败,没有细节就无济于事。
答案 1 :(得分:1)
如果您可以切换到CTE(我不知道为什么不这样做的原因),那么事情会变得更加简单,因为您不必使用CASE
中的所有GROUP BY
子句(是的,您必须使用它;不,您不能避免它)。
例如:
with temp as
-- this mimics your current query
(select ename,
case when deptno = 10 then 'abc'
else 'xyz'
end dept,
case when job = 'clerk' then 'cl'
else 'not cl'
end job
from emp
)
select listagg(ename, ',') within group (order by ename) ename,
dept,
job
from temp
group by dept, job; --> this! Instead of using CASEs here, use their aliases