【问题标题】:Listagg in query having aliases查询中的 Listagg 具有别名
【发布时间】:2019-05-14 19:19:02
【问题描述】:

我在一个查询中有 99 列。大多数列都有case 语句,因此它们有别名。我必须在这样的一个专栏中使用listagg。 我是否需要将group by 放在剩余的 98 列中?当列有别名时如何分组,因为我们不能在group by 中使用别名?不使用group by 是否可以使用listagg

【问题讨论】:

  • 一些样本数据和期望的结果会很有帮助。如果你想使用listagg(),你想使用聚合,那么group by为什么会有问题呢?

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


【解决方案1】:

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 仅函数需要的数据,然后将其重新加入主查询。

这是一个普遍的失败,如果没有具体细节就无能为力了。

【讨论】:

    【解决方案2】:

    如果您可以切换到 CTE(我看不出为什么不这样做的原因),那么事情会变得更简单,因为您不必在 GROUP BY 子句中使用所有这些 CASEs(是的,你必须使用它;不,你不能避免它)。

    例如:

    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
    

    【讨论】:

      猜你喜欢
      • 2015-04-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多