it-swarm.com.de

ORA-00979 keine Gruppe nach Ausdruck

Ich erhalte ORA-00979 mit der folgenden Abfrage:

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;

Ich konnte keine Beispiele finden, die sowohl GROUP BY- als auch ORDER BY-Klauseln in derselben Abfrage enthielten. Ich habe versucht, jedes Feld einzeln aus der Gruppe zu entfernen, bekomme aber immer noch den gleichen Fehler.

121
Theresa

Sie müssen alle Spalten der SELECT in den GROUP BY setzen oder Funktionen verwenden, die die Ergebnisse auf einen einzelnen Wert komprimieren (wie MIN, MAX oder SUM).

Ein einfaches Beispiel, um zu verstehen, warum dies geschieht: Stellen Sie sich vor, Sie haben eine Datenbank wie diese:

FOO BAR
0   A
0   B

und Sie führen SELECT * FROM table GROUP BY foo aus. Dies bedeutet, dass die Datenbank eine einzige Zeile als Ergebnis mit der ersten Spalte 0 zurückgeben muss, um den GROUP BY zu erfüllen, es stehen jedoch jetzt zwei Werte von bar zur Auswahl. Welches Ergebnis würden Sie erwarten - A oder B? Oder sollte die Datenbank mehr als eine Zeile zurückgeben, was den Vertrag von GROUP BY verletzt?

206
Aaron Digulla

Schließen Sie alle SELECT-Ausdrücke in die GROUP BY-Klausel ein, die keine Gruppenfunktionsargumente sind. 

15
Xaisoft

Schade, dass Oracle solche Einschränkungen hat. Sicher, das Ergebnis für eine Spalte, die nicht in GROUP BY enthalten ist, wäre zufällig, aber manchmal möchte man das. Dummes Oracle, Sie können dies in MySQL/MSSQL tun.

ABER es gibt eine Problemumgehung für Oracle:

Während die folgende Zeile nicht funktioniert

SELECT unique_id_col, COUNT(1) AS cnt FROM yourTable GROUP BY col_A;

Sie können Oracle mit einigen Nullen wie den folgenden überlisten, um die Spalte im Gültigkeitsbereich zu behalten, aber nicht nach ihr gruppieren (vorausgesetzt, es handelt sich um Zahlen, andernfalls verwenden Sie 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);
6
Joseph Lust

Sie sollten Folgendes tun: 

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

Die Gruppe by wird verwendet, um einige Daten zu aggregieren, abhängig von der Aggregatfunktion. Abgesehen davon müssen Sie Spalten oder Spalten angeben, zu denen Sie die Gruppierung benötigen.

zum Beispiel: 

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

Dies führt zu einem maximalen Gehalt in den Abteilungen.

Wenn wir nun den d.deptno aus der group by-Klausel weglassen, wird derselbe Fehler ausgegeben.

1
Muhammad Nadeem

Wenn Sie mit der Klausel GROUP BY Tappen, werden alle Ausdrücke in SELECT, die keine Gruppenfunktion (oder Aggregatfunktion oder aggregierte Spalte) sind, wie COUNT, AVG, MIN, MAX, SUM usw. ( Liste der Aggregatfunktionen ) sollten in GROUP BY Klausel.

Beispiel (korrekter Weg) (hier ist employee_id Keine Gruppenfunktion (nicht aggregierte Spalte), also muss erscheint in GROUP BY. Im Gegensatz dazu ist sum (salary) eine Gruppenfunktion (aggregierte Spalte) und muss daher nicht in der GROUP BY - Klausel aufgeführt werden.

   SELECT employee_id, sum(salary) 
   FROM employees
   GROUP BY employee_id; 

Beispiel (falscher Weg) (hier ist employee_id Keine Gruppenfunktion und erscheint nicht in der GROUP BY - Klausel, die wird zum ORA-00979 Fehler führen.

   SELECT employee_id, sum(salary) 
   FROM employees;

Um dies zu korrigieren, müssen Sie eins Folgendes tun:

  • Schließen Sie alle nicht aggregierten Ausdrücke, die in der SELECT -Klausel aufgeführt sind, in die GROUP BY - Klausel ein
  • Entfernen Sie die Gruppenfunktion (Aggregatfunktion) aus der SELECT -Klausel.
1
fg78nc

Zusätzlich zu den anderen Antworten kann dieser Fehler auftreten, wenn eine Klausel order by inkonsistent ist. Zum Beispiel:

select 
    substr(year_month, 1, 4)
    ,count(*) as tot
from
    schema.tbl
group by
    substr(year_month, 1, 4)
order by
    year_month
0
Mike Palmice

Der gleiche Fehler tritt auch auf, wennOBEREoderUNTERE- Schlüsselwort nicht an beiden Stellen in select-Ausdruck und gruppiert nach Ausdruck verwendet wird.

Falsch :-

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

Recht :-

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