具有别名的查询中的Listagg

时间:2019-05-14 19:19:03

标签: sql database oracle group-by database-administration

查询中有99列。大多数列都具有case语句,因此它们具有别名。我必须在其中一列中使用listagg。 我是否需要在其余98列中放入group by?因为我们无法在group by中使用别名,所以当列具有别名时如何分组?不使用listagg就能使用group by吗?

2 个答案:

答案 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