查询分组中的 Oracle SQL 条件聚合函数

Posted

技术标签:

【中文标题】查询分组中的 Oracle SQL 条件聚合函数【英文标题】:Oracle SQL Conditional aggregate function in group by query 【发布时间】:2019-01-07 06:49:56 【问题描述】:

我正在尝试编写一个查询,该查询将根据驱动聚合的用户提供的表聚合表中的数据。当我只使用 sum 语句时,它可以正常工作,但是当我将 sum 放在 case 语句中以允许用户指定 sum、count、mean 等时,我得到了 group by 错误。

我换了:

 sum(column) 

与:

 CASE b.calculationtype
      WHEN 'SUM'                  THEN SUM(column)
      WHEN 'MEAN'                 THEN AVG(column)
      WHEN 'COUNT'                THEN COUNT(column)
      WHEN 'VARIANCE'             THEN VARIANCE(column)
      WHEN 'STANDARD DEVIATION'   THEN STDDEV(column)
 END

在按函数评估分组时,Oracle 是否看到了 case 语句之外的内容,还是我试图根据表 b 中的值更改实际的聚合函数?

我总是可以用蛮力强制它并将计算类型逻辑移到实际查询之外,但这似乎有点痛苦,因为我有 5 个具有不同聚合函数的相同查询,这些函数根据计算类型被调用字段。

   select b.REPORT,
          case b.AGG_VARIABLE_A_FLAG
           when 'N' then null
           when 'Y' then a.AGG_VARIABLE_A
          end,
          case b.AGG_VARIABLE_B_FLAG
           when 'N' then null
           when 'Y' then a.AGG_VARIABLE_B
          end,

          --<<< problem starts >>>

          case b.CALCULATIONTYPE
           when 'SUM' then sum(a.column1)  when 'MEAN' then avg(a.column1)  when 'COUNT' then count(a.column1)  when 'VARIANCE' then variance(a.column1)  when 'STANDARD DEVIATION' then stddev(a.column1)
          end,
          case b.CALCULATIONTYPE
           when 'SUM' then sum(a.column2)  when 'MEAN' then avg(a.column2)  when 'COUNT' then count(a.column2)  when 'VARIANCE' then variance(a.column2)  when 'STANDARD DEVIATION' then stddev(a.column2)
          end

          --<<< problem ends >>

     from DATA_TABLE a
             cross join CONTROL_TABLE b
    where a.ID = bind_variable_id
          and a.SOURCEARRAY = b.SOURCEARRAY
          and b.CALCULATIONTYPE <> 'INTERNAL'
    group by b.REPORT,
          case b.AGG_VARIABLE_A_FLAG
           when 'N' then null
           when 'Y' then a.AGG_VARIABLE_A
          end,
          case b.AGG_VARIABLE_B_FLAG
           when 'N' then null
           when 'Y' then a.AGG_VARIABLE_B
          end

【问题讨论】:

您是否考虑将 b.CALCULATIONTYPE 添加到“group by”语句中?在上面的摘录中它丢失了。 例如,计算类型为 sum,我期望如下: (REPORT, sum(x1), sum(x2), sum(x3)...) 计算类型为意思是,我希望得到以下输出:(REPORT, avg(x1), avg(x2), avg(x3)...)。报告名称具有它的输出类型(以及其他字段)。我试图让一个查询根据所选的聚合函数聚合 30 个左右的字段,而不是有 5 个查询,每个函数一次。基本上,我采用了一个包含 sum(column1)、sum(column2) 等的工作查询,并将其更改为案例计算类型……这有帮助吗?谢谢 嗨 Pham,这就是我想要的(value1 可以是总和、平均值或计数)。该表使用其他字段标识输出类型。这是我的用户从我的流程中获取输出的报告表。 大声笑 Koen,做到了。 (捂脸)谢谢!! 【参考方案1】:

GROUP BY 子句中添加b.calculationtype

【讨论】:

以上是关于查询分组中的 Oracle SQL 条件聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

Oracle_SQL 分组与聚合函数

SQL学习笔记 ----Mysql数据库的条件查询

SQL语句的补充

Oracle数据库,模糊查询去重查询

基础-SQL-DQL-分组查询

18 12 06 sql 的 基本语句 查询 条件查询 逻辑运算符 模糊查询 范围查询 排序 聚合函数 分组 分页 连接查询 自关联 子查询