理解并解决 SQL 查询中的 ORA-00979
当 SQL 查询错误地使用 GROUP BY
子句时,会出现 ORA-00979 错误“不是 GROUP BY 表达式”。 当 SELECT
语句包含 GROUP BY
子句中未提及的列,或在列上使用聚合函数而不进行分组时,会发生这种情况。
GROUP BY
子句对指定列中具有相同值的行进行分组,允许聚合函数(如 SUM
、AVG
、MIN
、MAX
、COUNT
)来汇总每个组内的数据。 如果没有正确的分组,数据库无法确定哪些值与每个组关联,从而导致错误。
示例和解决方案:
导致此错误的常见情况涉及选择多个列,但仅按子集进行分组。 数据库无法确定每个组中未分组列的单个值。
要解决此问题,可以:
在 GROUP BY
子句中包含所有非聚合列:如果您想查看所选列的所有唯一组合,这是最简单的解决方案。
对非分组列使用聚合函数:如果您只需要某些列的汇总统计,请将聚合函数(如 MIN
、MAX
或 AVG
)应用于这些列。 这会将输出减少为每组一行。
让我们用一个更正后的查询来说明:
<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中文网其他相关文章!