CASE WHEN [Résolu]

theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 21 févr. 2013 à 11:23 - Dernière réponse : yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention
- 23 févr. 2013 à 15:05
Bonjour tous le monde,

j'ai un soucis avec une requête, qui me renvoie l'erreur : Invalid use of group fuction
je m'explique :

Je veux faire le calcul via la fonction SUM() sur plusieurs lignes d'une table ayant un champ identique mais avec une restriction dans le WHERE,le problème est que si cette restriction n'existe pas (parce qu’elle n'est pas encore remplie) dans la ligne, elle ne me retourne rien.

Cela sera plus parlant avec la requête :

SELECT *,SUM(MONTANT_EURO) AS TOTAL FROM note n 
LEFT JOIN depense d ON(n.ID_NOTE=d.ID_NOTE) 
WHERE CASE WHEN COUNT(ID_DEPENSE)> 0 THEN ID_RUBRIQUE != 7 END 
GROUP BY n.ID_NOTE ORDER BY n.ID_NOTE ASC	


En gros si COUNT(ID_DEPENSE) me renvoie 0 c'est que la ligne n'existe pas et dans ce cas je veux que le WHERE soit vide (pour qu'il me renvoie les autres informations sans le SUM(), sinon si COUNT(ID_DEPENSE) est supérieur à 0 dans ce cas le WHERE possède la restriction ID_RUBRIQUE != 7

Voila j’espère avoir su m'expliquer.
Si vous avez une idée,
Merci d'avance.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Afficher la suite 

6 réponses

Répondre au sujet
theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 21 févr. 2013 à 13:29
+3
Utile
hum, pas terrible l'affichage .

SELECT *,SUM(MONTANT_EURO) AS TOTAL FROM note n
LEFT JOIN depense d ON(n.ID_NOTE=d.ID_NOTE)
LEFT JOIN etat e ON(n.ID_ETAT=e.ID_ETAT)
WHERE (SELECT CASE WHEN COUNT(ID_DEPENSE)> 0 THEN d.ID_RUBRIQUE != 7 ELSE 1 END)
AND ID_EMPLOYE="'.$_SESSION['ID_EMPLOYE'].'" GROUP BY n.ID_NOTE ORDER BY n.ID_NOTE ASC


-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Cette réponse vous a-t-elle aidé ?  
Commenter la réponse de theflayer
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 21 févr. 2013 à 12:38
0
Utile
Salut,

le CASE WHEN ne peut pas servir pour des clauses conditionnelles.

Fais une requête non sommée dans ton premier cas, unie avec une requête non sommée pour ton autre cas, puis encapsule dans une requête de somme. Il ya peut-être meilleure solution mais c'est la première qui me vient à l'esprit.
Commenter la réponse de cs_jopop
theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 21 févr. 2013 à 13:27
0
Utile
Salut jopop,

incroyable, dans n'importe quel langage, c'est toujours toi le premier a venir me secourir .

Alors le CASE WHEN peut servire dans les clauses conditionnelles, mais c'est vraiment très chiant.

Après 2 bonnes journées de prise de tête j'en suis arrivée a là et ça à l'air d'être fonctionnelle.

SELECT *,SUM(MONTANT_EURO) AS TOTAL FROM note n 									    LEFT JOIN depense d ON(n.ID_NOTE=d.ID_NOTE) 										LEFT JOIN etat e ON(n.ID_ETAT=e.ID_ETAT)									    WHERE (SELECT CASE WHEN COUNT(ID_DEPENSE)> 0 THEN d.ID_RUBRIQUE != 7 ELSE 1 END)								    AND ID_EMPLOYE="'.$_SESSION['ID_EMPLOYE'].'" GROUP BY n.ID_NOTE ORDER BY n.ID_NOTE ASC


voila voila.
J’espère que ça pourra en aider quelqu'un.
Je met en résolu.

Merci encore Jopop.

-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Commenter la réponse de theflayer
cs_jopop 1540 Messages postés lundi 26 mai 2003Date d'inscription 1 août 2013 Dernière intervention - 21 févr. 2013 à 13:47
0
Utile
J'ai t'ai répondu et c'est moi qui ai appris un truc,
comme quoi c'est donnant donnant

Par contre fait une vérif' à la main sur un jeu de données limité, perso je viens de faire un test de cette utilisation du CASE WHEN (simplifié) qui n'a pas été probant.
Commenter la réponse de cs_jopop
theflayer 125 Messages postés dimanche 28 février 2010Date d'inscription 21 juin 2015 Dernière intervention - 21 févr. 2013 à 14:17
0
Utile
Avec plaisir si pour une fois je peux servir !

Alors le CASE WHEN est rarement utilisé dans la clause apparemment,
et les différente syntaxe que j'ai trouvé sur le net, furent plus compliquées les une que les autres et ne fonctionnaient pas de surcroît.

Puis en pensant a la syntaxe de base qui est plutôt au niveau du SELECT (comme c'est montré dans la doc mysql) je me suis dit rien ne m'interdis d'essayer avec un SELECT imbriqué et la bingooooo .

Alors pour moi ça fonctionne niquel, cela m'affiche l'ensemble des données, même si la ligne n'existe pas et cela me fait le calcul sans me compter ceux qui ont un ID_RUBRIQUE=7

Donc je touche plus .
Enfin sur ce, merci encore d'être intervenu, et si je peux t'aider, je suis là .


-La constante d'une personne est la variable d'une autre.
-Il y a deux manières d'écrire des programmes sans erreurs. Seule la troisième marche
-Tout programme a (au moins) deux buts : celui pour lequel il a été écrit, et celui pour lequel il ne l'a pas
Commenter la réponse de theflayer
yann_lo_san 1137 Messages postés lundi 17 novembre 2003Date d'inscription 23 janvier 2016 Dernière intervention - 23 févr. 2013 à 15:05
0
Utile
Salut,

c'est chelou ce where "sans condition", il suffit de faire ça :

SELECT bla bla
WHERE d.ID_RUBRIQUE != CASE WHEN COUNT(ID_DEPENSE)>0 THEN 7 ELSE -1 END
and bla bla

(!= -1 renvoi tout)

bye...
Commenter la réponse de yann_lo_san

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.