173

次のクエリで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;

同じクエリでGROUPBY句とORDERBY句の両方を含む例は見つかりませんでした。グループから各フィールドを一度に1つずつ削除しようとしましたが、それでも同じエラーが発生します。

4

8 に答える 8

265

のすべての列を配置SELECTするGROUP BYか、結果を単一の値(、、など)に圧縮する関数を使用するMIN必要MAXがありますSUM

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

FOO BAR
0   A
0   B

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

于 2009-10-05T15:02:02.897 に答える
22

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

于 2009-10-05T15:01:47.763 に答える
9

残念なことに、Oracleにはこのような制限があります。確かに、GROUP BYにない列の結果はランダムになりますが、必要な場合もあります。愚かなオラクル、あなたは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);
于 2011-04-26T18:26:35.070 に答える
7

include句を使用してグループ化を行う場合は、、、、などのグループ関数(または集計関数または集計列)ではない、の式GROUP BY(集計関数のリスト)を句に含める必要があります。SELECTCOUNTAVGMINMAXSUMGROUP 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句からグループ(集計)関数を削除します。
于 2017-07-11T06:49:06.680 に答える
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;
于 2016-04-19T06:28:16.750 に答える
2

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

間違い :-

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

右 :-

select UPPER(a) , count(*) from my_table group by UPPER(a) .
于 2017-03-23T10:52:10.330 に答える
1

他の回答に加えて、このエラーは、orderby句に矛盾がある場合に発生する可能性があります。例えば:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
于 2019-02-11T14:57:25.220 に答える
0

group byは、集計関数に応じて一部のデータを集計するために使用されます。それ以外の場合は、グループ化が必要な1つまたは複数の列を配置する必要があります。

例えば:

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

これにより、部門の最高給与が発生します。

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

于 2016-04-07T07:26:28.757 に答える