Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[MySQL] R

14 réponses
Avatar
zebul0n
Bonjour,

Ayant un petit problème pour générer un graphique à partir des résultats
de ma requête SQL, je vous soumet mon problème.

j'ai deux tables :

______________________________
| commande |
|------------------------------|
| id | nom | montant | facture |
|______________________________|

______________________________
| facture |
|------------------------------|
| id | commande_id | echeance |
|______________________________|

et j'effectue la requête suivante afin de récupérer les montants des
commandes par mois :

SELECT SUM(commande.montant) ca, MONTH(facture.echeance)
facture_echeance_mois FROM facture, commande WHERE commande.facture = '1'
AND YEAR(facture.echeance)='2007' AND facture.commande_id = commande.id
GROUP BY facture_echeance_mois ORDER BY facture_echeance_mois
ASC, SUM(commande.montant) DESC;

Je n'ai des commandes qu'en mars, avril, juillet et août.

J'obtiens donc le résultat suivant :
_____________________________________
| ca | facture_echeance_mois |
|_____________________________________|
| 27584.10 | 3 |
| 1008.00 | 4 |
| 11393.55 | 7 |
| 888.12 | 8 |
|_____________|_______________________|

C'est bien le résultat escompté et les résultats sont corrects.

Cependant, j'aimerais obtenir le résultat suivant :
_____________________________________
| ca | facture_echeance_mois |
|_____________________________________|
| 0 | 1 |
| 0 | 2 |
| 27584.10 | 3 |
| 1008.00 | 4 |
| 0 | 5 |
| 0 | 6 |
| 11393.55 | 7 |
| 888.12 | 8 |
| 0 | 9 |
| 0 | 10 |
| 0 | 11 |
| 0 | 12 |
|_____________|_______________________|

afin de générer un graphique avec les montants commandés par mois.

Pourriez vous m'aider à modifier ma requête afin d'obtenir les résultats
pour tous les mois de l'année.
J'aimerais que cela soit possible, cela m'éviterais de devoir ensuite
traiter les résultats avec php.

PS: Je dois garder ces deux tables distinctes (je n'ai pas mis tous
les champs de chacune de ces tables)

Merci pour votre aide.

Cordialement,

zeb.

4 réponses

1 2
Avatar
Thierry B.
--{ Fred Brouard - SQLpro a plopé ceci: }--

SQL ne saurait inventé des donnés qui n'existe pas dans votre système
d'information. Or à la base ces dates n'existent probablement pas dans
votre SI. Il y a là à l'évidence un défaut de votre modèle de données.



C'est bizarre, en survolant les requètes de l'OP, j'ai cru
voir des extraction de mois sur un champ (probablement) de
type 'date' dans la table facture. Il faut toujours lire
les posts en entier avant de troller.


SELECT SUM(commande.montant) ca, MONTH(facture.echeance)





Accessoirement, vous quotez comme un goret.

--
Avec les trucs (assembleurs, compilateurs, interpréteur) j'ai eu parfois
l'impression de vouloir manipuler des billes avec des gants de boxe.
Mais on se fait vite au confort!
--{ fr.comp.ordinosaures }--
Avatar
nobody
Thierry B. a écrit :
--{ Fred Brouard - SQLpro a plopé ceci: }--

SQL ne saurait inventé des donnés qui n'existe pas dans votre système
d'information. Or à la base ces dates n'existent probablement pas dans
votre SI. Il y a là à l'évidence un défaut de votre modèle de données.



C'est bizarre, en survolant les requètes de l'OP, j'ai cru
voir des extraction de mois sur un champ (probablement) de
type 'date' dans la table facture. Il faut toujours lire
les posts en entier avant de troller.

SELECT SUM(commande.montant) ca, MONTH(facture.echeance)





Accessoirement, vous quotez comme un goret.



et si y avait que cela à lui reprocher ce ne serait rien ...... :-)
Avatar
zebul0n
Thierry B. a écrit :

C'est bizarre, en survolant les requètes de l'OP, j'ai cru
voir des extraction de mois sur un champ (probablement) de
type 'date' dans la table facture. Il faut toujours lire
les posts en entier avant de troller.


SELECT SUM(commande.montant) ca, MONTH(facture.echeance)



Effectivement, le champ echeance est de type 'date', mais je ne comprends
pas le sens de votre remarque. Pourriez vous être plus explicite ?

Cordialement.
Avatar
Patrick Mevzek
Le Sat, 04 Aug 2007 23:12:01 +0000, zebul0n a écrit:
Pourriez vous m'aider à modifier ma requête afin d'obtenir les résultats
pour tous les mois de l'année.



Une façon de faire, probablement pas la seule, et sûrement améliorable,
qui fonctionne avec PostgreSQL, et devrait fonctionner aussi avec MySQL,
dans une version suffisamment récente.

Soit __S__ votre requête initiale.
Soit mois une table dans la base, avec un seul attribut mois, et 12
lignes, mois de 1 à 12.

La requête suivante donne la table comme vous le souhaitez :
SELECT mois.mois,COALESCE(total.prix,0) FROM (__S__) AS
total(mois,prix) RIGHT OUTER JOIN mois ON (total.mois=mois.mois);

Cela fonctionne aussi avec UNION, qui dédoublonne par défaut, mais
cela part du principe que les doublons sont recherchés dans l'ordre
d'écriture des tables dans la requête, je ne sais pas si c'est un postulat
garanti.

SELECT * FROM (__S__) AS total(mois,prix) UNION SELECT mois,0 FROM mois;


On peut améliorer les choses en évitant la sous-requête sur __S__ en
ré-ecrivant cette dernière, et en particulier en sortant le ORDER BY.

--
Patrick Mevzek . . . . . . . . . . . . . . Dot and Co
<http://www.dotandco.net/> <http://www.dotandco.com/>
Dépêches sur le nommage <news://news.dotandco.net/dotandco.info.news>
1 2