Je cherche à produire un jeu de données pour générer des graphiques, en l'occurrence un histogramme qui me représente le nombre d'objets répondant à un critère, par semaine. Pour simplifier le post, je vais supposer qu'il s'agit de commandes d'articles sur Internet, et que je veux mesurer le nombre de commandes envoyées par semaine.
J'utilise pour ça deux tables :
- Une table "commandes" qui contient un enregistrement par commande effectuée,
- Une table "etats" qui m'indique les états successifs de chaque commande (passée, payée, expédiée, livrée, etc) avec les dates correspondantes.
Commandes : ID
Nom | |
1 | Saucisse |
2 | Sabre laser |
3 | Planche à découper |
Etats : ID
Commande | Etat | Date | |
1 | 1 | passée | 01/01/10 |
2 | 1 | payée | 04/01/10 |
3 | 1 | expédiée | 05/01/10 |
4 | 2 | passée | 04/01/10 |
5 | 2 | payée | 07/01/10 |
6 | 3 | passée | 05/01/10 |
7 | 3 | payée | 08/01/10 |
6 | 3 | expédiée | 10/01/10 |
6 | 3 | livrée | 15/01/10 |
Avec ces données, je voudrais compter le nombre de commandes expédiées par semaines sur un intervalle donné, c'est à dire obtenir un tableau de cette forme :
Semaine
Nbr commandes expédiées | |
S01 | 1 |
S02 | 1 |
S03 | 0 |
S04 | 0 |
Le problème (parcequ'il y a *toujours* un problème !) c'est que je n'ai quasiment aucune liberté sur la requête SQL. En raison de contraintes diverses, je suis obligé de suivre un modèle du style "SELECT [champs] FROM commandes, etats WHERE commandes.id = etats.commande AND [filtres] GROUP BY [groupes]", dans lequel je peux mettre ce que je veux à la place de "[champs]", "[filtres]" et "[groupes]" (à condition que ce soit des expressions SQL valides bien sûr). Du coup j'ai tenté un truc de ce style :
SELECT
DATE_FORMAT(commandes.date, '%Y S%U') semaine,
SUM(CASE WHEN etats.etat = 'expédiée' THEN 1 ELSE 0 END) nb_expediees
FROM
commandes,
etats
WHERE
commandes.id = etats.commande AND
etats.date >= '01/01/10' AND
etats.date < '01/02/10'
GROUP BY
semaine
ORDER BY
semaine
Mais il y a deux soucis :
- Si une commande est expédiée plusieurs fois (c'est envisageable), elle sera comptabilisée plusieurs fois, alors que je ne voudrais jamais compter deux fois une même commande (donc prendre soit la première expédition, soit la dernière, mais pas les deux) ;
- Si aucune commande n'est expédiée pendant une semaine, la ligne correspondant à cette semaine ne sera pas présente dans le résultat (par exemple si on a aucune expédition en semaine 03, le tableau va passer directement de S02 à S04, d'où un trou dans le graphique).
S'il est impossible de s'en sortir, je vais devoir changer complètement de fusil d'épaule. Mais avant de faire ça, j'aurais voulu savoir si par hasard il n'y avait pas un moyen de s'en sortir plus facilement, parceque ça me ferait quand même gagner une bonne journée de boulot ^^
Merci
