CASE WHEN [Résolu]

Messages postés
125
Date d'inscription
dimanche 28 février 2010
Dernière intervention
21 juin 2015
- - Dernière réponse : yann_lo_san
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
- 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 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Dernière intervention
21 juin 2015
3
Merci
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

Merci theflayer 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources a aidé 97 internautes ce mois-ci

Commenter la réponse de theflayer
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
0
Merci
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
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Dernière intervention
21 juin 2015
0
Merci
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Dernière intervention
1 août 2013
0
Merci
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
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Dernière intervention
21 juin 2015
0
Merci
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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Dernière intervention
23 janvier 2016
0
Merci
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.