ORA-00979式によるグループ化ではありません


147

次のクエリで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つずつ削除しようとしましたが、それでも同じエラーが発生します。

回答:


232

あなたは、すべての列を入れなければなりませんSELECTGROUP BYか(のような単一の値に結果を圧縮し、それらの機能を使用しMINMAXまたはをSUM)。

これが発生する理由を理解するための簡単な例:次のようなデータベースがあるとします。

FOO BAR
0   A
0   B

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


7
いいえ、注文
ごと

3
ORDER BYの2つの列をGROUP BYに追加してみました。うまくいきました。ありがとう!
テレサ

1
または別の言い方をすると、2つの列があり、最初の列でグループ化している場合、結果の行ごとに2番目の列の値が複数あることになります。結果行は1つしかありませんが、選択する値は多数あるので、DBはどれを返す必要がありますか?最初につまずく?
Aaron Digulla

6
@AaronDigullaそれがMySQLが行うことであり、世界は終わらなかった:p
クリスベイカー14

1
部分的に同意します。ただし、次の場合を想定します。A、B、C、Dの4つの列があるとします。次に、(A、B、C)を複合キーとして設定します。次に、「select A、B、max(C)、D ... group by A、B」はあいまいではありません。A、B、Cの各組み合わせに対して、Dはすでに定義されているためです。それでもオラクルはその仕事をすることを拒否します。
GA

17

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


9

残念ながら、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);

@GlennFromIowa私の疑似テーブルが上記で厳密に定義されておらず、11gの会社ではもう働いていないことを考えると、より良い例を提供できませんが、最後にテストしたときは問題でした。
ジョセフラスト2015年

4
好奇心から、ランダムな結果が必要な場合の例は何ですか?FOOでグループ化してBARのランダムな行を取得する理由は考えられません。
カイルブリデンスティン

4

あなたは、以下を含むによってグループ化しなければGROUP BY句における任意の式SELECTのグループ関数(または集約関数または集約カラム)ではない、などCOUNTAVGMINMAXSUMなど(上の集合関数のリスト)で存在すべきである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句からグループ(集計)関数を削除します。

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;

1

選択式とグループ化式の両方でUPPERまたはLOWERキーワードが使用されていない場合にも、同じエラーが発生します。

違う :-

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 d.deptno, max(e.sal) 
from emp e, dept d
where e.deptno = d.deptno
group by d.deptno;

これは、部門の最大給与になります。

d.deptnofrom group by句を省略すると、同じエラーが発生します。


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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.