marcmoonlight
Messages postés2Date d'inscriptionvendredi 11 septembre 2009StatutMembreDernière intervention11 septembre 2009
-
11 sept. 2009 à 02:02
marcmoonlight
Messages postés2Date d'inscriptionvendredi 11 septembre 2009StatutMembreDernière intervention11 septembre 2009
-
11 sept. 2009 à 22:52
Bonsoir,
Je cherche à construire des rapports périodiques (somme des ventes par mois par exemple) en une seule requête, sans sauter de période.
Un simple SELECT comme suit par exemple a pour lacune de sauter un mois s'il n'y a pas de vente :
SELECT DATE_FORMAT(date_facture, '%Y-%m') AS period, SUM(total) FROM factures GROUP BY DATE_FORMAT(date_facture, '%Y-%m) ORDER BY DATE_FORMAT(date_facture, '%Y-%m);
Alors je pense utiliser par exemple un LEFT JOIN qui me permettrai de lister d'une part les périodes, et d'autre part y joindre les résultats de la "vraie" requête. Il me reste donc à lister correctement les périodes. Mais comment construire le contenu d'une table dans une requete ?
Existe-t-il une notation du genre : SELECT period FROM LIST('2009-01', '2009-02', '2009-03') ?
Si oui, je pourrai écrire une requête dans le genre :
SELECT period FROM LIST('2009-01', '2009-02', '2009-03') AS p
LEFT JOIN SELECT DATE_FORMAT(date_facture, '%Y-%m') AS period, SUM(total) FROM factures AS f GROUP BY DATE_FORMAT(date_facture, '%Y-%m) ORDER BY DATE_FORMAT(date_facture, '%Y-%m) ON p.period=f.period
Ou bien une autre méthode est-elle plus courante ?
Merci beaucoup !
Marc
A voir également:
Quelle requete écrire pour demander au moteur de recherche
marcmoonlight
Messages postés2Date d'inscriptionvendredi 11 septembre 2009StatutMembreDernière intervention11 septembre 2009 11 sept. 2009 à 22:52
Bon ! J'ai trouvé ma réponse : une première série de UNION de SELECT des périodes qui m'intéressent, puis un LEFT JOIN pour chaque valeur à mesurer. Et mon script PHP pourra afficher les résultats de manière "passive" :
SELECT p.period, IFNULL( t.turnover, 0 ) AS turnover
FROM (
SELECT "2009-01" AS period
UNION SELECT "2009-03" AS period
UNION SELECT "2009-04" AS period
UNION SELECT "2009-05" AS period
UNION SELECT "2009-06" AS period
UNION SELECT "2009-07" AS period
UNION SELECT "2009-08" AS period
UNION SELECT "2009-09" AS period
) AS p
LEFT JOIN (
SELECT DATE_FORMAT( date_bill, "%Y-%m" ) AS period, SUM( total_amount_ht ) AS turnover
FROM customer_bills
WHERE _id_customer_account =3238
GROUP BY DATE_FORMAT( date_bill, "%Y-%m" )
) AS t ON p.period = t.period
Reste maintenant à créer une procédure stockée pour récupérer ma liste de périodes (elle prendrait en paramètres le zoom (= le pattern du DATE_FORMAT) et la plage de dates (from et until)). Quelqu'un aurait-il une suggestion ?