Requetes pour rapports périodiques

marcmoonlight Messages postés 2 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 11 septembre 2009 - 11 sept. 2009 à 02:02
marcmoonlight Messages postés 2 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 11 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

1 réponse

marcmoonlight Messages postés 2 Date d'inscription vendredi 11 septembre 2009 Statut Membre Dernière intervention 11 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 ?

Merci !

Marc
0
Rejoignez-nous