Comprendre et résoudre ORA-00979 dans les requêtes SQL
L'erreur ORA-00979, "pas une expression GROUP BY", se produit lorsqu'une requête SQL utilise une clause GROUP BY
de manière incorrecte. Cela se produit lorsque l'instruction SELECT
inclut des colonnes non mentionnées dans la clause GROUP BY
ou utilise des fonctions d'agrégation sur des colonnes sans regroupement.
La clause GROUP BY
regroupe les lignes avec des valeurs identiques dans des colonnes spécifiées, permettant aux fonctions d'agrégation (comme SUM
, AVG
, MIN
, MAX
, COUNT
) de résumer les données au sein de chaque groupe. Sans regroupement approprié, la base de données ne peut pas déterminer les valeurs à associer à chaque groupe, ce qui entraîne l'erreur.
Exemple et solution :
Un scénario courant provoquant cette erreur implique la sélection de plusieurs colonnes, mais uniquement le regroupement par un sous-ensemble. La base de données n'est pas en mesure de déterminer une valeur unique pour les colonnes non regroupées au sein de chaque groupe.
Pour résoudre ce problème, soit :
Inclure toutes les colonnes non agrégées dans la clause GROUP BY
: C'est la solution la plus simple si vous souhaitez voir toutes les combinaisons uniques des colonnes sélectionnées.
Utilisez les fonctions d'agrégation sur des colonnes non groupées : Si vous n'avez besoin que de statistiques récapitulatives pour certaines colonnes, appliquez des fonctions d'agrégation (comme MIN
, MAX
ou AVG
) à ces colonnes. Cela réduira la sortie à une seule ligne par groupe.
Illustrons avec une requête corrigée :
<code class="language-sql">SELECT cr.review_sk, cr.cs_sk, cr.full_name, MIN(TO_CHAR(cf.fact_date, 'mm/dd/yyyy')) AS appt, -- Using MIN to aggregate the date 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, cr.full_name, cs.cs_id, cr.tracking_number -- All non-aggregated columns are now included ORDER BY cs.cs_id, cr.full_name;</code>
En incluant correctement toutes les colonnes non agrégées dans la clause GROUP BY
, la requête s'exécutera sans l'erreur ORA-00979, garantissant l'intégrité des données et fournissant les résultats attendus. N'oubliez pas de choisir l'approche (incluant toutes les colonnes ou utilisant des fonctions d'agrégation) qui correspond le mieux à vos besoins d'analyse de données.
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!