173

我通过以下查询得到 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;

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

4

8 回答 8

265

您必须将 的所有列放在SELECTGROUP BY在其上使用将结果压缩为单个值的函数(如MINMAXSUM)。

一个简单的例子来理解为什么会发生这种情况:假设你有一个这样的数据库:

FOO BAR
0   A
0   B

你跑SELECT * FROM table GROUP BY foo。这意味着数据库必须返回单行作为结果,第一列0才能满足,GROUP BY但现在有两个值bar可供选择。你会期待哪个结果 -AB?或者数据库应该返回多于一行,违反合同GROUP BY

于 2009-10-05T15:02:02.897 回答
22

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

于 2009-10-05T15:01:47.763 回答
9

太糟糕了,Oracle 有这些限制。当然,不在 GROUP BY 中的列的结果将是随机的,但有时您想要这样。愚蠢的甲骨文,你可以在 MySQL/MSSQL 中做到这一点。

但是 Oracle 有一个解决方法:

虽然以下行不起作用

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;

您可以使用如下所示的一些 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);
于 2011-04-26T18:26:35.070 回答
7

如果您通过包含GROUP BY子句进行分组,SELECT则任何不是组函数(或聚合函数或聚合列)的表达式,例如COUNT, AVG, MIN,MAXSUM聚合函数列表)都应该出现在GROUP BY子句中。

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

   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 

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

   SELECT employee_id, sum(salary) 
   FROM employees;

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

  • SELECT在子句中包含 GROUP BY子句中列出的所有非聚合表达式
  • SELECT从子句中删除组(聚合)函数。
于 2017-07-11T06:49:06.680 回答
2

您应该执行以下操作:

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, cs.cs_id, cr.full_name
ORDER BY cs.cs_id, cr.full_name;
于 2016-04-19T06:28:16.750 回答
2

当UPPERLOWER 关键字在 select expression 和 group by expression 中都没有使用时,也会出现同样的错误。

错误的 :-

select a , count(*) from my_table group by UPPER(a) .

正确的 :-

select UPPER(a) , count(*) from my_table group by UPPER(a) .
于 2017-03-23T10:52:10.330 回答
1

除了其他答案之外,如果 order by 子句不一致,可能会导致此错误。例如:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
于 2019-02-11T14:57:25.220 回答
0

group by 用于聚合一些数据,具体取决于聚合函数,除此之外,您需要将需要分组的列或列放入其中。

例如:

select d.deptno, max(e.sal) 
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;

这将导致部门的最高工资。

现在,如果我们省略d.deptnofrom group by 子句,它会给出同样的错误。

于 2016-04-07T07:26:28.757 回答