[RESOLU] mois et chiffres dans un tableau

Eléphant du PHP | 84 Messages

05 avr. 2014, 01:54

J'ai commencé à travailler la dessus, je comprend enfin le principe c'est déjà pas mal, et également réussi à en traiter pour d'autres besoins.
Les additions je m'en sors grâce à ton aide, les tris en fonctions de certaines conditions ça va aussi, mais dès qu'il s'agit de compter le nombre d'enregistrement par mois alors ça coince.
J'ai bien le nombre, mais tout se met dans la colonne du mois de janvier, sauf si j'indique dans le WHERE que je recherche uniquement ceux de février par exemple.
SELECT year(date_vente) annee,
      CASE WHEN MONTH(date_vente) = 1 THEN count(vente) ELSE 0 END Jan,
      CASE WHEN MONTH(date_vente) = 2 THEN count(vente) ELSE 0 END Fev,
      CASE WHEN MONTH(date_vente) = 3 THEN count(vente) ELSE 0 END Mar,
      CASE WHEN MONTH(date_vente) = 4 THEN count(vente) ELSE 0 END Avril,
      CASE WHEN MONTH(date_vente) = 5 THEN count(vente) ELSE 0 END Mai,
      CASE WHEN MONTH(date_vente) = 6 THEN count(vente) ELSE 0 END Juin,
      CASE WHEN MONTH(date_vente) = 7 THEN count(vente) ELSE 0 END Juil,
      CASE WHEN MONTH(date_vente) = 8 THEN count(vente) ELSE 0 END Avril,
      CASE WHEN MONTH(date_vente) = 9 THEN count(vente) ELSE 0 END Sept,
      CASE WHEN MONTH(date_vente) = 10 THEN count(vente) ELSE 0 END Oct,
      CASE WHEN MONTH(date_vente) = 11 THEN count(vente) ELSE 0 END Nov,
      CASE WHEN MONTH(date_vente) = 12 THEN count(vente) ELSE 0 END `Dec`, 
      COUNT(*)  total
FROM      contacts 
WHERE     vente ='1'
GROUP BY annee;
Ou alors peut être que je me suis complètement planté sur l’écriture...
c'est pas simple tout ça

Mammouth du PHP | 571 Messages

05 avr. 2014, 16:26

mais dès qu'il s'agit de compter le nombre d'enregistrement par mois alors ça coince.
compter le nombre d'enregistrement(je suppose le nombre de ventes) consiste à regrouper sur les colonnes mois et année.
1ère proposition: si t'as pas besoin d'afficher tous les 12 mois ( que les mois pour lesquels des ventes ont été réalisées):
SELECT year(date_vente) annee, month(date_vente) as mois, count(vente) as nb_ventes_par_mois
FROM      contacts
GROUP BY annee, mois;

2ème proposition:
en revanche si tu veux compter le nombre de ventes par mois tout en affichant les mois où il n y a eu aucune vente( donc zero vente) tu peux tester tous 12 mois dans ta requête :


SELECT year(date_vente) annee, month(date_vente) as mois
      count(CASE WHEN MONTH(date_vente) = 1 THEN vente ELSE null END) Jan,
      count(CASE WHEN MONTH(date_vente) = 2 THEN vente ELSE null END) Fev,
      count(CASE WHEN MONTH(date_vente) = 3 THEN vente ELSE null END) Mar,
      //...pareil pour les autres mois
      count(CASE WHEN MONTH(date_vente) = 12 THEN vente ELSE null END) `Dec`
     
FROM      contacts

GROUP BY annee, mois;
un point très important la table contacts ne peut pas contenir à la fois des personnes, des prix, des ventes... il y a forcement un problème de modélisation qu'il faut revoir.

Eléphant du PHP | 84 Messages

05 avr. 2014, 17:12

Je n'avais pas pensé à la 1ere solution, mais la 2eme je l'ai tenté et effectivement elle ne fonctionne pas
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'count(CASE WHEN MONTH(date_vente) = 1 THEN vente ELSE NULL END) Jan, count' at line 2: SELECT year(date_vente) annee, month(date_vente) AS mois count(CASE WHEN MONTH(date_vente) = 1 THEN vente ELSE NULL END) Jan, count(CASE WHEN MONTH(date_vente) = 2 THEN vente ELSE NULL END) Fev, count(CASE WHEN MONTH(date_vente) = 3 THEN vente ELSE NULL END) Mar FROM contacts GROUP BY annee, mois
Pour ce qui est de la table contact qui comprend prix, vente, produit etc... je l'ai réalisé comme ça car les prix ne sont pas fixes et ils sont à renseigner lors de l'enregistrement du nouveau contact(client) (d'ou la colonne ttc et non ht qui est calculé avec l addition de la tva). Et chaque contact est unique, donc un seul produit par contact.

Mammouth du PHP | 571 Messages

05 avr. 2014, 17:25

il y a une virgule qui manque après le champs mois:



SELECT year(date_vente) annee, month(date_vente) AS mois,
      count(CASE WHEN MONTH(date_vente) = 1 THEN vente ELSE NULL END) Jan,
      count(CASE WHEN MONTH(date_vente) = 2 THEN vente ELSE NULL END) Fev,
      count(CASE WHEN MONTH(date_vente) = 3 THEN vente ELSE NULL END) Mar,
      //...pareil pour les autres mois
      count(CASE WHEN MONTH(date_vente) = 12 THEN vente ELSE NULL END) `Dec`
     
FROM      contacts

GROUP BY annee, mois;
 

Eléphant du PHP | 84 Messages

05 avr. 2014, 17:37

Je viens de comprendre pourquoi j'ai passé un temps fou hier à ne pas réussir.
le NULL était remplacé par 0 et c'est pourquoi le résultat qui en sortait était le nombre global qui apparaissait tous les mois.
Bon ça commence à rentrer. En tout cas Yann, très bon prof.. merci;)