CASE WHEN

[Résolu]
Signaler
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
-
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
-
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
A voir également:

6 réponses

Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
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
Messages postés
1540
Date d'inscription
lundi 26 mai 2003
Statut
Membre
Dernière intervention
1 août 2013
12
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.
Messages postés
125
Date d'inscription
dimanche 28 février 2010
Statut
Membre
Dernière intervention
21 juin 2015
2
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
Messages postés
1137
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
23 janvier 2016
24
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...