Dépannage ORA-00979 : GROUP BY
et ORDER BY
Conflits de clauses
L'erreur ORA-00979 dans SQL résulte d'une incompatibilité entre les clauses GROUP BY
et ORDER BY
. GROUP BY
regroupe les données, tandis que ORDER BY
les trie. L'erreur se produit lorsque ORDER BY
inclut des colonnes non présentes dans GROUP BY
.
Comprendre le problème
Considérez cet exemple de requête qui produit l'erreur ORA-00979 :
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, LISTAGG(TO_CHAR(cf.fact_date, 'mm/dd/yyyy'), ',') WITHIN GROUP (ORDER BY cf.fact_date) AS "appt", cs.cs_id, cr.tracking_number FROM review cr JOIN cs ON cr.cs_sk = cs.cs_sk JOIN fact cf ON cr.review_sk = cf.review_wk WHERE UPPER(cs.cs_id) LIKE '%' || UPPER(i_cs_id) || '%' AND row_delete_date_time IS NULL AND cr.fact_type_code = 183050 GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number ORDER BY cs.cs_id, cr.full_name;</code>
L'erreur vient de ORDER BY cs.cs_id, cr.full_name
. cs.cs_id
et cr.full_name
ne sont pas dans la clause GROUP BY
.
Solutions
Pour résoudre ORA-00979, toutes les colonnes de ORDER BY
doivent soit être dans GROUP BY
, soit être agrégées :
Solution 1 : Ajouter à GROUP BY
Si les colonnes sont indispensables au regroupement, incluez-les dans la clause GROUP BY
:
<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number, cs.cs_id, cr.full_name ORDER BY cs.cs_id, cr.full_name;</code>
Solution 2 : Utiliser des fonctions d'agrégation
Si les colonnes ne sont pas cruciales pour le regroupement, utilisez des fonctions d'agrégation telles que MIN
, MAX
ou d'autres appropriées à vos données :
<code class="language-sql">GROUP BY cr.review_sk, cr.cs_sk, cr.tracking_number ORDER BY MIN(cs.cs_id), MIN(cr.full_name);</code>
Le choix de la bonne solution dépend de la logique de votre requête et des résultats souhaités. L'ajout à GROUP BY
conserve plus de détails, tandis que l'utilisation de fonctions d'agrégation résume les données au sein des groupes. Examinez attentivement les implications de chaque approche avant de la mettre en œuvre. N'oubliez pas d'utiliser des fonctions d'agrégation appropriées en fonction de vos données et du résultat souhaité.
Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!