ORA-00979不是按表达式分组

The*_*esa 138 sql oracle ora-00979

我通过以下查询获得ORA-00979:

SELECT cr.review_sk, cr.cs_sk, cr.full_name,
tolist(to_char(cf.fact_date, 'mm/dd/yyyy')) "appt",
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, cf.fact_date, cr.tracking_number
ORDER BY cs.cs_id, cr.full_name;
Run Code Online (Sandbox Code Playgroud)

我找不到在同一查询中同时包含GROUP BY和ORDER BY子句的任何示例.我尝试一次一个地从组中删除每个字段,但仍然得到相同的错误.

Aar*_*lla 219

你必须把的所有列SELECTGROUP BY或使用的压缩结果为单一值(如对他们的功能MIN,MAXSUM).

一个简单的例子来理解为什么会发生这种情况:想象一下,你有一个像这样的数据库:

FOO BAR
0   A
0   B
Run Code Online (Sandbox Code Playgroud)

并在运行SELECT * FROM table GROUP BY foo.这意味着数据库必须返回单行作为结果,第一列0才能完成,GROUP BY但现在有两个值bar可供选择.你期望哪个结果 - A或者B?或者数据库是否应该返回多行,违反了合同GROUP BY

  • 不,您不需要将它们放在您的订单中 (6认同)
  • @AaronDigulla这就是MySQL所做的,世界并没有结束:p (4认同)
  • 我尝试将ORDER BY中的两列添加到GROUP BY.那很有效.谢谢! (2认同)

Xai*_*oft 16

GROUP BY子句中包含所有SELECT不是组函数参数的表达式.


Jos*_*ust 9

太糟糕了,Oracle有这样的局限性.当然,不在GROUP BY中的列的结果将是随机的,但有时您需要它.愚蠢的Oracle,你可以在MySQL/MSSQL中做到这一点.

但是有一个解决Oracle的工作:

虽然以下行不起作用

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;
Run Code Online (Sandbox Code Playgroud)

您可以使用类似下面的0来欺骗Oracle,以使您的列保持在范围内,但不能将其分组(假设这些是数字,否则使用CONCAT)

SELECT MAX(unique_id_col) AS unique_id_col, COUNT(1) AS cnt 
FROM yourTable GROUP BY col_A, (unique_id_col*0 + col_A);
Run Code Online (Sandbox Code Playgroud)

  • 出于好奇,你想要一个随机结果的例子是什么?我想不出你想要由FOO分组并获得BAR的随机行的任何理由. (3认同)

fg7*_*8nc 9

如果您通过 includeGROUP BY子句进行分组,则 中的任何非组函数(或聚合函数或聚合列)的表达式,如SELECTCOUNTAVGMIN等(聚合函数列表)都应出现在子句中。MAXSUMGROUP BY

示例(正确方法)(这里employee_id不是分组函数(非聚合列),所以必须出现在 中GROUP BY。相比之下,sum(salary) 是分组函数(聚合列),所以不需要出现在子句GROUP BY中。

   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 
Run Code Online (Sandbox Code Playgroud)

示例(错误的方式)(这里employee_id不是组函数,也没有出现在GROUP BY子句中,这会导致 ORA-00979 错误。

   SELECT employee_id, sum(salary) 
   FROM employees;
Run Code Online (Sandbox Code Playgroud)

要纠正,您需要执行以下操作之一

  • SELECT将子句 中列出的所有非聚合表达式包含在GROUP BY子句中
  • 从子句中删除组(聚合)函数SELECT