UNE REQUETE SQL

Résolu
zaydoo Messages postés 8 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 10 avril 2010 - 15 juil. 2009 à 11:44
zaydoo Messages postés 8 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 10 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
.
.
.

et merci beaucoup

6 réponses

nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
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é ;)
3
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
16 juil. 2009 à 12:03
je te suggere donc de modifier ta table MyMonth tel que :

Create table MyMonth (ID_Mois int, Mois varchar(15));

et les insert :

insert into MyMonth (Mois) values (MONTH('01/01/2009'),MONTHNAME('01/01/2009'));

etc.

puis de changer ton order by comme suit :

ORDER BY MyMonth.ID_Mois

La ca marche, je l'ai fait a l'instant sur mon sql server (en adaptant la synthaxe).
3
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
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)

et ca devrait jouer ;)
0
nivsql Messages postés 159 Date d'inscription lundi 22 juin 2009 Statut Membre Dernière intervention 14 décembre 2010 1
15 juil. 2009 à 19:09
oups j'ai oublier de remplacer la clause de GROUP BY =>

GROUP BY MyMonth.Mois

;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
zaydoo Messages postés 8 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 10 avril 2010
16 juil. 2009 à 09:37
merci de ta repense...
mais ça marche pas toujours le même problème
0
zaydoo Messages postés 8 Date d'inscription mercredi 7 janvier 2009 Statut Membre Dernière intervention 10 avril 2010
17 juil. 2009 à 10:25
MERCI BEAUCOUP
ça marche bien
0
Rejoignez-nous