Page 1 sur 1

Requetes pour rapports périodiques

Posté : 11 sept. 2009, 01:04
par marc moonlight
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

Re: Requetes pour rapports périodiques

Posté : 11 sept. 2009, 22:57
par marc moonlight
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