Je reçois ORA-00979 avec la requête suivante:
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;
Je n'ai trouvé aucun exemple contenant des clauses GROUP BY et ORDER BY dans la même requête. J'ai essayé de supprimer chaque champ du groupe un par un, mais j'obtiens toujours la même erreur.
Incluez dans la
GROUP BY
clause toutes lesSELECT
expressions qui ne sont pas des arguments de fonction de groupe.la source
Dommage qu'Oracle ait des limitations comme celles-ci. Bien sûr, le résultat pour une colonne qui ne figure pas dans GROUP BY serait aléatoire, mais parfois vous le souhaitez. Silly Oracle, vous pouvez le faire dans MySQL / MSSQL.
MAIS il existe une solution pour Oracle:
Bien que la ligne suivante ne fonctionne pas
Vous pouvez tromper Oracle avec des 0 comme ce qui suit, pour garder votre colonne dans la portée, mais pas grouper par elle (en supposant que ce sont des nombres, sinon utilisez CONCAT)
la source
Si vous ne le regroupement en vertu d'inclure la
GROUP BY
clause, toute expressionSELECT
, ce qui est fonction de groupe (ou fonction d' agrégation ou d'une colonne agrégée) , tels queCOUNT
,AVG
,MIN
,MAX
,SUM
etc. ( Liste des fonctions d' agrégation ) doit être présent dans l'GROUP BY
article.Exemple (manière correcte) (ici
employee_id
n'est pas une fonction de groupe (colonne non agrégée), elle doit donc apparaître dansGROUP BY
. En revanche, sum (salaire) est une fonction de groupe (colonne agrégée), il n'est donc pas nécessaire qu'elle apparaisse dans laGROUP BY
clause .Exemple (mauvaise manière) (ici
employee_id
n'est pas une fonction de groupe et elle n'apparaît pas dans laGROUP BY
clause, ce qui entraînera l'erreur ORA-00979.Pour corriger, vous devez effectuer l' une des opérations suivantes:
SELECT
clause de laGROUP BY
clauseSELECT
clause.la source
Vous devez faire ce qui suit:
la source
La même erreur survient également lorsque le mot clé UPPER ou LOWER n'est pas utilisé à la fois dans l'expression select et group by expression.
Faux :-
Droite :-
la source
Le groupe par est utilisé pour agréger certaines données, en fonction de la fonction d'agrégation, et à part cela, vous devez placer la ou les colonnes dans lesquelles vous avez besoin du regroupement.
par exemple:
Cela se traduira par le salaire maximum des départements.
Maintenant, si nous omettons la
d.deptno
clause from group by, cela donnera la même erreur.la source
En plus des autres réponses, cette erreur peut se produire s'il y a une incohérence dans un ordre par clause. Par exemple:
la source