zaydoo
Messages postés8Date d'inscriptionmercredi 7 janvier 2009StatutMembreDernière intervention10 avril 2010
-
15 juil. 2009 à 11:44
zaydoo
Messages postés8Date d'inscriptionmercredi 7 janvier 2009StatutMembreDernière intervention10 avril 2010
-
17 juil. 2009 à 10:25
BONJOUR LES AMIS
je veux faire une requête qui affiche le nombre de commande par mois trié en ordre croissant; j'ai fais cette requête:
SELECT MONTHNAME(date_commande) AS 'Mois', Count(*) AS 'Nombre de commande'
FROM commande
GROUP BY MONTHNAME(date_commande)
ORDER BY MONTH(date_commande)
ça marche mais je veux que les mois quels n'existent pas s'affichent et le nombre de commande sera afficher 0.
exemple:
voila l'affichage de ma requête
January 11
March 1
April 1
May 1
June 1
.
.
.
je veux l'afficher comme ça:
January 11
February 0
March 1
April 1
May 1
June 1
.
.
.
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 16 juil. 2009 à 11:50
Ok je viens de faire des test et en effet je me suis trompé ;)
je te la refait et je met les corrections en rouge ;)
SELECT MyMonth.Mois, Count(commande.date_commande) AS 'Nombre de commande'
FROM commande
Right outer join MyMonth
on MONTHNAME(commande.date_commande) = MyMonth.Mois
GROUP BY MONTHNAME(commande.date_commande)
ORDER BY MONTH(commande.date_commande)
J'attire ton attention sur le fait que MONTH(commande.date_commande) sera NULL pour les mois ou tu n'as pas de commande aussi je t'invite a le remplacer par un MyMonth.ID_mois que tu aura préalablement renseigné ;)
nivsql
Messages postés159Date d'inscriptionlundi 22 juin 2009StatutMembreDernière intervention14 décembre 20101 15 juil. 2009 à 19:07
Salut, Tout d'abord remplace ton count(*) par un count(1) ca allegera la requete ;)
Ensuite si je comprend bien ton probleme c'est que tu as des mois pour lesquels tu n'as aucune commande par conséquent aucune ligne ne peut etre compté et il n'y a meme pas de date correspondant au bon mois dans ta table. Bref tu cherche a afficher des données qui n'existe tout simplement pas.
Je ne vois qu'une seule solution a ton probleme, créer une table des mois sur laquelle tu vas pouvoir faire une jointure externe :
Create table MyMonth ( Mois varchar(15));
ensuite tu allimente ta table :
insert into MyMonth (Mois) values (MONTHNAME('01/01/2009')); -- (attention au format de la date en chaine de caractere)
insert into MyMonth (Mois) values (MONTHNAME('01/02/2009'));
.
.
.
insert into MyMonth (Mois) values (MONTHNAME('01/12/2009'));
Ensuite tu accompli ta requete avec une jointure externe :
SELECT MyMonth.Mois, Count(1) AS 'Nombre de commande'
FROM commande
Left outer join MyMonth
on MONTHNAME(commande.date_commande) = MyMonth.Mois
GROUP BY MONTHNAME(commande.date_commande)
ORDER BY MONTH(commande.date_commande)
A ce stade tu vas avoir un truc du genre :
January 11
February NULL
March 1
April 1
May 1
June 1
.
.
.
Tu n'a plus qu'a encapsuler ton count(1) dans une fonction de gestion de la valeur null (de type COALESCE en SQL Server ou NVL sous oracle)
SELECT MyMonth.Mois, COALESCE(Count(1),0) AS 'Nombre de commande'
FROM commande
Left outer join MyMonth
on MONTHNAME(commande.date_commande) = MyMonth.Mois
GROUP BY MONTHNAME(commande.date_commande)
ORDER BY MONTH(commande.date_commande)