次のクエリで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つずつ削除しようとしましたが、それでも同じエラーが発生します。
SELECT
のすべての列をGROUP BY
に入れるか、結果を単一の値に圧縮する関数(MIN
、MAX
、SUM
など)を使用する必要があります。
これが起こる理由を理解するための簡単な例:このようなデータベースがあると想像してください:
FOO BAR
0 A
0 B
そして、SELECT * FROM table GROUP BY foo
を実行します。つまり、データベースは、0
を満たす最初の列GROUP BY
の結果として単一の行を返す必要がありますが、選択できるbar
の値は2つあります。あなたはどの結果を期待します-A
またはB
?または、GROUP BY
の規約に違反して、データベースが複数の行を返す必要がありますか?
グループ関数の引数ではないすべてのSELECT
式をGROUP BY
句に含めます。
残念なことに、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);
次のことを行う必要があります。
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;
他の回答に加えて、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
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
を省略すると、同じエラーが発生します。
GROUP BY
句を含めることで模索を行う場合、SELECT
、COUNT
、AVG
、MIN
、MAX
などのグループ関数(または集約関数または集約列)ではないSUM
の式はすべて( 集約関数 )はGROUP BY
句に存在する必要があります。
例(正しい方法)(ここでemployee_id
はグループ関数(非集計列)ではないため、mustGROUP BY
に表示されますが、sum(salary)はグループ関数(集計列)であるため、GROUP BY
clauseに表示する必要はありません。
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
句からグループ(集計)関数を削除します。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) .