ORA-00979不是按表达式分组

时间:2009-10-05 14:57:22

标签: 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;

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

8 个答案:

答案 0 :(得分:208)

您必须将SELECT的所有列放在GROUP BY中,或使用其中的函数将结果压缩为单个值(例如MINMAX或{ {1}})。

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

SUM

然后您运行FOO BAR 0 A 0 B 。这意味着数据库必须返回单行作为结果,第一列SELECT * FROM table GROUP BY foo才能实现0,但现在有两个GROUP BY值可供选择。您期望哪种结果 - barA?或者数据库是否应该返回多行,违反了B的合同?

答案 1 :(得分:15)

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

答案 2 :(得分:7)

太糟糕了,Oracle有这样的局限性。当然,不在GROUP BY中的列的结果将是随机的,但有时您需要它。愚蠢的Oracle,你可以在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);

答案 3 :(得分: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;

答案 4 :(得分:1)

group by用于聚合某些数据,具体取决于聚合函数,而不是您需要将列或列放到需要分组的位置。

例如:

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

这将导致部门最高工资。

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

答案 5 :(得分:1)

如果您通过包含GROUP BY子句进行摸索,SELECT中的任何表达式都不是组函数(或聚合函数或聚合列),例如COUNT,{{ 1}},AVGMINMAX等等(List of Aggregate functions)应出现在SUM子句中。

示例(正确方法)(此处GROUP BY不是群组功能(非聚合列),因此必须出现在employee_id中相比之下,sum(salary)是一个组函数(聚合列),因此不需要出现在GROUP BY子句中。

GROUP BY

示例(错误方式)(此处 SELECT employee_id, sum(salary) FROM employees GROUP BY employee_id; 不是组函数,它不会出现在employee_id子句中,这将导致ORA-00979错误。< / p>

GROUP BY

要纠正您需要执行以下一个

  • 包括 SELECT employee_id, sum(salary) FROM employees; 子句中列出的所有非聚合表达式 SELECT条款
  • GROUP BY子句中删除组(聚合)函数。

答案 6 :(得分: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

答案 7 :(得分:0)

UPPER LOWER 关键字未在select表达式和group by expression中同时使用时,也会出现相同的错误。

错误: -

mdb-export data.accdb TABLE > output_file.csv

右: -

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