[SQL] Decode, Case et GroupBy
Résolu
kewee
-
kewee -
kewee -
Bonjour,
J'ai un problème sur une requête SQL.
Voici la requête :
Cette requête me renvoie [I]ORA-00979: not a GROUP BY expression/I
Lorsque j'enlève le passage en gras, plus de problème,
DONC, tout laisse à penser que le problème vient de là...
don't you?
Merci de votre aide.
J'ai un problème sur une requête SQL.
Voici la requête :
SELECT T_CMP_TYPE_INDIC.ROUTAGE, T_INDIC.VAL_INDIC, T_FLUX.ID_MODE, T_INDIC.LIB_ACD, T_INDIC.ACD, DECODE(T_TYPE_INDIC.LIB_TYPE_INDIC,'Sortants DAC',CASE WHEN T_FLUX.FLUX IN (SELECT T_FLUX.FLUX FROM T_FLUX WHERE T_FLUX.TYPE_INDIC_AUTRES=1) THEN 'Sortants Otres' ELSE 'Sortants DhAC' END,T_TYPE_INDIC.LIB_TYPE_INDIC), T_TYPE_INDIC.TYPE_INDIC, T_TYPE_INDIC.AVEC_SEUIL_1, T_TYPE_INDIC.AVEC_SEUIL_2, sum(T_INDIC.SEUIL_1_DEPASSE), sum(T_INDIC.SEUIL_2_DEPASSE), avg(T_INDIC.SEUIL_1), avg(T_INDIC.SEUIL_2), T_CMP_TYPE_INDIC.ORD_AFF, T_FLUX.GROUP_FLUX, T_INDIC.FLUX FROM T_INDIC, T_FLUX, T_TYPE_INDIC, T_CMP_TYPE_INDIC WHERE ( T_CMP_TYPE_INDIC.TYPE_INDIC=T_TYPE_INDIC.TYPE_INDIC ) AND ( nvl(T_CMP_TYPE_INDIC.ID_MODE,'#')=nvl(T_INDIC.ID_MODE,'#') and nvl(T_CMP_TYPE_INDIC.ROUTAGE,'#')=nvl(T_INDIC.ROUTAGE,'#') and nvl(T_CMP_TYPE_INDIC.TYPE_INDIC,'#')=nvl(T_INDIC.TYPE_INDIC,'#') ) AND ( T_FLUX.FLUX=T_INDIC.FLUX and T_FLUX.ID_MODE=T_INDIC.ID_MODE ) GROUP BY T_CMP_TYPE_INDIC.ROUTAGE, T_INDIC.VAL_INDIC, T_FLUX.ID_MODE, T_INDIC.LIB_ACD, T_INDIC.ACD, DECODE(T_TYPE_INDIC.LIB_TYPE_INDIC,'Sortants DAC',CASE WHEN T_FLUX.FLUX IN (SELECT T_FLUX.FLUX FROM T_FLUX WHERE T_FLUX.TYPE_INDIC_AUTRES=1) THEN 'Sortants Otres' ELSE 'Sortants DhAC' END,T_TYPE_INDIC.LIB_TYPE_INDIC), T_TYPE_INDIC.TYPE_INDIC, T_TYPE_INDIC.AVEC_SEUIL_1, T_TYPE_INDIC.AVEC_SEUIL_2, T_CMP_TYPE_INDIC.ORD_AFF, T_FLUX.GROUP_FLUX, T_INDIC.FLUX;
Cette requête me renvoie [I]ORA-00979: not a GROUP BY expression/I
Lorsque j'enlève le passage en gras, plus de problème,
DONC, tout laisse à penser que le problème vient de là...
don't you?
Merci de votre aide.
A voir également:
- Sql decode
- Comment decode - Guide
- Decode ascii - Guide
- Logiciel sql - Télécharger - Bases de données
- Requete sql pix - Forum PHP
- Additions et multiplication dans des requêtes SQL ✓ - Forum MySQL
4 réponses
Salut,
Not a group by <== pour pouvoir faire un select avec une clause group by à la fin, on a le droit a utiliser dans la partie champs sélectionnés uniquement:
- des (pseudo)colonnes obtenues via des opérations mathématiques sur le résultat (AVG, MIN, MAX, SUM, etc)
- des colonnes individuelles mais déclarées par la suite dans la clause group by
Comme je ne vois pas de section en gras, je ne sais pas ce que tu as essayé d'enlever.
++
Not a group by <== pour pouvoir faire un select avec une clause group by à la fin, on a le droit a utiliser dans la partie champs sélectionnés uniquement:
- des (pseudo)colonnes obtenues via des opérations mathématiques sur le résultat (AVG, MIN, MAX, SUM, etc)
- des colonnes individuelles mais déclarées par la suite dans la clause group by
Comme je ne vois pas de section en gras, je ne sais pas ce que tu as essayé d'enlever.
++
Lorsque j'enlèves les deux occurences suivantes, ca marche :
DECODE(T_TYPE_INDIC.LIB_TYPE_INDIC,'Sortants DAC',CASE WHEN T_FLUX.FLUX IN (SELECT T_FLUX.FLUX FROM T_FLUX WHERE T_FLUX.TYPE_INDIC_AUTRES=1) THEN 'Sortants Otres' ELSE 'Sortants DhAC' END,T_TYPE_INDIC.LIB_TYPE_INDIC),
Je n'arrive pas trop à suivre ton decode. La syntaxe tordue amène qqhose par rapport à ceci https://www.techonthenet.com/oracle/functions/decode.php ?
Sinon, en règle générale, voici un exemple de requ^te qui marche:
==> tu remarques que dans la section group by je ne reprends pas la clause decode entièrement, mais uniquement la colonne concernée.
++
Sinon, en règle générale, voici un exemple de requ^te qui marche:
SELECT taskid, MAX (schedbegdate), DECODE (deplan_reason, 1, 'one', 2, 'two') FROM tasko GROUP BY taskid, deplan_reason
==> tu remarques que dans la section group by je ne reprends pas la clause decode entièrement, mais uniquement la colonne concernée.
++
Ok, je comprend la syntaxe mais ca ne marche pas, toujours la meme erreur au niveau du GROUP BY.
La syntaxe du décode est tordue en effet et peut etre y a til une syntaxe plus simple.
Je cherche à modifier des libellés "Sortants DAC" en autre chose SEULEMENT SI le flux en question à un indicateur_autre à 1. Il peut il avoir plusieurs flux.
est il possible d'écrire un DECODE :
DECODE(expr,search,result,défault)
avec en <search>, une requête retournant plusieurs valeurs ?
La syntaxe du décode est tordue en effet et peut etre y a til une syntaxe plus simple.
Je cherche à modifier des libellés "Sortants DAC" en autre chose SEULEMENT SI le flux en question à un indicateur_autre à 1. Il peut il avoir plusieurs flux.
est il possible d'écrire un DECODE :
DECODE(expr,search,result,défault)
avec en <search>, une requête retournant plusieurs valeurs ?
est il possible d'écrire un DECODE :
DECODE(expr,search,result,défault)
avec en <search>, une requête retournant plusieurs valeurs ? <== oui, bien sûr.
Vérifie bien que toutes les colonnes utilisées dans la clause DECODE sont bien présentes dans la partie GROUP BY. Par exemple, il me semble que pour
T_FLUX.FLUX
ce n'est pas le cas. Attention, si tu fais une jointure, il faut que le colonne utilisée dans DECODE se retrouve exactement (i.e. même table!) dans la clause GROUP BY.
==> T.INDIC.FLUX ne couvre pas T_FLUX.FLUX ci-dessus !
DECODE(expr,search,result,défault)
avec en <search>, une requête retournant plusieurs valeurs ? <== oui, bien sûr.
Vérifie bien que toutes les colonnes utilisées dans la clause DECODE sont bien présentes dans la partie GROUP BY. Par exemple, il me semble que pour
T_FLUX.FLUX
ce n'est pas le cas. Attention, si tu fais une jointure, il faut que le colonne utilisée dans DECODE se retrouve exactement (i.e. même table!) dans la clause GROUP BY.
==> T.INDIC.FLUX ne couvre pas T_FLUX.FLUX ci-dessus !