web-dev-qa-db-ja.com

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句の両方がある例は見つかりませんでした。グループから各フィールドを1つずつ削除しようとしましたが、それでも同じエラーが発生します。

127
Theresa

SELECTのすべての列をGROUP BYに入れるか、結果を単一の値に圧縮する関数(MINMAXSUMなど)を使用する必要があります。

これが起こる理由を理解するための簡単な例:このようなデータベースがあると想像してください:

FOO BAR
0   A
0   B

そして、SELECT * FROM table GROUP BY fooを実行します。つまり、データベースは、0を満たす最初の列GROUP BYの結果として単一の行を返す必要がありますが、選択できるbarの値は2つあります。あなたはどの結果を期待します-AまたはB?または、GROUP BYの規約に違反して、データベースが複数の行を返す必要がありますか?

208
Aaron Digulla

グループ関数の引数ではないすべてのSELECT式をGROUP BY句に含めます。

15
Xaisoft

残念なことに、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);
8
Joseph Lust

次のことを行う必要があります。

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;
2
Pavel Zimogorov

他の回答に加えて、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
1
Mike Palmice

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を省略すると、同じエラーが発生します。

1
Muhammad Nadeem

GROUP BY句を含めることで模索を行う場合、SELECTCOUNTAVGMINMAXなどのグループ関数(または集約関数または集約列)ではないSUMの式はすべて( 集約関数 )はGROUP BY句に存在する必要があります。

例(正しい方法)(ここでemployee_idはグループ関数(非集計列)ではないため、mustGROUP BYに表示されますが、sum(salary)はグループ関数(集計列)であるため、GROUP BYclauseに表示する必要はありません。

   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句からグループ(集計)関数を削除します。
1
fg78nc

UPPERまたはLOWERキーワードがselect式とgroup by expressionの両方で使用されていない場合にも同じエラーが発生します。

間違った:-

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

右:-

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