[SQL] Decode, Case et GroupBy

Résolu/Fermé
kewee - 9 déc. 2008 à 16:49
 kewee - 10 déc. 2008 à 10:56
Bonjour,

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:

4 réponses

sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
9 déc. 2008 à 17:04
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.

++
0
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),
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
9 déc. 2008 à 17:21
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:
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.

++
0
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 ?
0
sandul Messages postés 3924 Date d'inscription jeudi 22 mai 2008 Statut Membre Dernière intervention 8 octobre 2010 722
9 déc. 2008 à 18:22
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 !
0
Merci beaucoup, le problème est résolu.
Bonne journée.
0