Otrzymuję ORA-00979 z następującym zapytaniem:
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;
Nie mogłem znaleźć żadnych przykładów, które miałyby klauzule GROUP BY i ORDER BY w tym samym zapytaniu. Próbowałem usunąć każde pole z grupy pojedynczo, ale nadal pojawia się ten sam błąd.
Uwzględnij w
GROUP BY
klauzuli wszystkieSELECT
wyrażenia, które nie są argumentami funkcji grupy.źródło
Szkoda, że Oracle ma takie ograniczenia. Jasne, wynik dla kolumny, której nie ma w GROUP BY byłby losowy, ale czasami tego chcesz. Głupia Oracle, możesz to zrobić w MySQL / MSSQL.
ALE istnieje obejście dla Oracle:
Chociaż poniższa linia nie działa
Możesz oszukać Oracle za pomocą kilku 0, takich jak poniżej, aby utrzymać kolumnę w zakresie, ale nie grupować według niej (zakładając, że są to liczby, w przeciwnym razie użyj CONCAT)
źródło
Jeśli nie grupowania dzięki tym
GROUP BY
klauzulę, każdy wyraz wSELECT
, co nie jest funkcja grupa (lub funkcja kruszywa lub zagregowane kolumna), takie jakCOUNT
,AVG
,MIN
,MAX
,SUM
i tak dalej ( Lista funkcji agregujących ) powinny być obecne wGROUP BY
klauzuli.Przykład (poprawny sposób) (tutaj
employee_id
nie jest funkcja grupowa (kolumna niezagregowana), więc musi się pojawić wGROUP BY
. Z kolei suma (wynagrodzenie) jest funkcją grupową (kolumna zagregowana), więc nie jest wymagane, aby występowała wGROUP BY
klauzuli .Przykład (błędny sposób) (tutaj
employee_id
nie jest funkcja grupowa i nie pojawia się wGROUP BY
klauzuli, co doprowadzi do błędu ORA-00979.Aby poprawić, musisz wykonać jedną z następujących czynności:
SELECT
klauzuli wGROUP BY
klauzuliSELECT
klauzuli.źródło
Należy wykonać następujące czynności:
źródło
Ten sam błąd pojawia się również, gdy UPPER lub LOWER słowo kluczowe nie jest używane zarówno w miejscu w wyrażeniu zaznaczania, jak iw grupie według wyrażenia.
Źle :-
Dobrze :-
źródło
Grupuj według służy do agregowania niektórych danych, w zależności od funkcji agregującej, i poza tym, że musisz umieścić kolumnę lub kolumny, do których potrzebujesz grupowania.
na przykład:
Zaowocuje to maksymalnym wynagrodzeniem działów.
Teraz, jeśli pominiemy
d.deptno
klauzulę from group by, wystąpi ten sam błąd.źródło
Oprócz innych odpowiedzi ten błąd może wystąpić, jeśli występuje niespójność w kolejności w klauzuli. Na przykład:
źródło