首页 >数据库 >mysql教程 >如何解决 ORA-00979:SQL 查询中的分组列?

如何解决 ORA-00979:SQL 查询中的分组列?

Mary-Kate Olsen
Mary-Kate Olsen原创
2025-01-24 04:52:09728浏览

How to Resolve ORA-00979: Grouping Columns in SQL Queries?

理解并解决 SQL 查询中的 ORA-00979

当 SQL 查询错误地使用 GROUP BY 子句时,会出现 ORA-00979 错误“不是 GROUP BY 表达式”。 当 SELECT 语句包含 GROUP BY 子句中未提及的列,或在列上使用聚合函数而不进行分组时,会发生这种情况。

GROUP BY 子句对指定列中具有相同值的行进行分组,允许聚合函数(如 SUMAVGMINMAXCOUNT)来汇总每个组内的数据。 如果没有正确的分组,数据库无法确定哪些值与每个组关联,从而导致错误。

示例和解决方案:

导致此错误的常见情况涉及选择多个列,但仅按子集进行分组。 数据库无法确定每个组中未分组列的单个值。

要解决此问题,可以:

  1. GROUP BY 子句中包含所有非聚合列:如果您想查看所选列的所有唯一组合,这是最简单的解决方案。

  2. 对非分组列使用聚合函数:如果您只需要某些列的汇总统计,请将聚合函数(如 MINMAXAVG)应用于这些列。 这会将输出减少为每组一行。

让我们用一个更正后的查询来说明:

<code class="language-sql">SELECT 
    cr.review_sk, 
    cr.cs_sk, 
    cr.full_name,
    MIN(TO_CHAR(cf.fact_date, 'mm/dd/yyyy')) AS appt, -- Using MIN to aggregate the date
    cs.cs_id, 
    cr.tracking_number
FROM 
    review cr, cs, fact cf
WHERE 
    cr.cs_sk = cs.cs_sk
    AND UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%'
    AND row_delete_date_time IS NULL
    AND cr.review_sk = cf.review_wk (+)
    AND cr.fact_type_code (+) = 183050
GROUP BY 
    cr.review_sk, cr.cs_sk, cr.full_name, cs.cs_id, cr.tracking_number -- All non-aggregated columns are now included
ORDER BY 
    cs.cs_id, cr.full_name;</code>

通过在 GROUP BY 子句中正确包含所有非聚合列,查询将在执行时不会出现 ORA-00979 错误,从而确保数据完整性并提供预期结果。 请记住选择最适合您的数据分析需求的方法(包括所有列或使用聚合函数)。

以上是如何解决 ORA-00979:SQL 查询中的分组列?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn