2009-10-05 73 views
96

我得到ORA-00979与下面的查询:ORA-00979不是一个GROUP BY表达式

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子句的任何实例。我一次尝试从组中删除每个字段,但仍然收到相同的错误。

回答

166

你必须把SELECT的所有列在其上的GROUP BY或使用功能,其压缩结果为单一值(如MINMAXSUM)。

一个简单的例子就明白了,为什么发生这种情况:假设你有一个这样的数据库:

FOO BAR 
0 A 
0 B 

和运行SELECT * FROM table GROUP BY foo。这意味着数据库必须返回单行,结果第一列0满足GROUP BY,但现在有两个值bar可供选择。您期望得到哪个结果 - AB?还是应该数据库返回多行,违反了GROUP BY的合同?

+0

即使那些在ORDER BY子句中的呢?我的GROUP BY中没有这两个。 – Theresa 2009-10-05 15:09:02

+6

不,你不需要按照条款 – Xaisoft 2009-10-05 15:10:43

+2

将它们放在你的订单中我试着将ORDER BY中的两列添加到GROUP BY中。这工作。谢谢! – Theresa 2009-10-05 15:12:36

13

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

2

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

但有一个变通的Oracle:

虽然以下行不起作用

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

你就可以欺骗甲骨文与一些0的类似下面,让您的列范围,但不是由它组成(假设这些是数字,否则使用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); 
+0

@GlennFromIowa由于我的伪表没有严格定义在上面,而且我不再为11g的公司工作,所以我不能提供一个更好的示例,尽管这是我上次测试它时遇到的一个问题。 – 2015-11-21 00:14:43

+1

出于好奇,什么时候你想要一个随机结果的例子?我想不出任何你想按FOO进行分组的原因,并得到BAR的随机排。 – 2017-10-17 17:48:06

1

group by用于聚合so我的数据,这取决于聚合函数,除此之外,你需要把你需要分组的列或列。

例如:

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

这将导致该部门的最高薪水。

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

1

你应该做到以下几点:当在选择表达和组通过表达两个地方不使用UPPERLOWER关键字

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; 
0

同样的错误也来了。

错误: -

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

右: -

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

如果您还凭借摸索包括GROUP BY条款,在SELECT任何表情,这是不群功能(或聚合函数或聚合列),例如COUNT,AVG,MIN,,SUM等(List of Aggregate functions)应存在于GROUP BY条款中。

实施例(正确方式)(这里employee_id不是组功能(非聚集的柱),所以它必须出现在GROUP BY。相比之下,总和(工资)是一组功能(凝聚柱),所以它不需要出现在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; 

要纠正你需要做以下的一个

  • 附上 GROUP BY条款
  • 删除组(聚合)功能在SELECT子句中列出所有的非聚集表达式从SELECT条款。