[RESOLU] mois et chiffres dans un tableau

Répondre


Cette question est un moyen d’empêcher des soumissions automatisées de formulaires par des robots.
Smileys
:D :) :( :o :shock: :? 8-) :lol: :x :P :oops: :cry: :evil: :twisted: :roll: :wink: :!: :?: :idea: :arrow: :| :mrgreen: =D> #-o =P~ :^o :non: :priere: 8-|
Voir plus de smileys
  Revue du sujet
 

  Étendre la vue Revue du sujet : [RESOLU] mois et chiffres dans un tableau

Re: [RESOLU] mois et chiffres dans un tableau

par moimeme30 » 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;)

Re: [RESOLU] mois et chiffres dans un tableau

par yann18 » 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;
 

Re: [RESOLU] mois et chiffres dans un tableau

par moimeme30 » 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.

Re: [RESOLU] mois et chiffres dans un tableau

par yann18 » 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.

Re: [RESOLU] mois et chiffres dans un tableau

par moimeme30 » 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

Re: [RESOLU] mois et chiffres dans un tableau

par yann18 » 04 avr. 2014, 23:42

Pour information, c'est bien un opérateur pivot? si c'est bien le cas, connais tu un site en français qui explique le principe?
J'ai cherché, j'ai essayé, mais j comprend pas tout :(
les opérateurs de PIVOT n'existent pas sous MySQL donc ils ne sont pas supportés nativement.Néanmoins on peut simuler le pivot comme je l'ai fait avec case when.

En effet le CASE WHEN n'est qu'une structure conditionnelle comme le if ou switch case du PHP. Dans le cas de ta requête les CASE IF transforment les lignes en colonnes et on prend soin d'en attribuer des alias(Jan, fev,....).

Par exemple cette instruction évalue d'abord que le mois en cours de lecture correspond à mars puis fait le cumul de tous les ttc de mars(au passage un ttc n'a pas besoin d'être stocké en base car on peut en déduire à partir du ht):
         SUM(CASE WHEN MONTH(date_vente) = 3 THEN ttc ELSE 0 END)  mars,    
la syntaxe de CASE WHEN:
CASE WHEN condition THEN instructions ELSE instructions END
exemples à tester dans une console sql:
SELECT CASE WHEN 7=4 THEN 'vrai' ELSE 'faux' END; 
--faux

--ou avec IF
SELECT IF(7=4, 'vrai','faux');
--faux

--si c'est avril alors retourner mois en cours sinon retourner autre mois
SELECT (CASE WHEN MONTH(NOW())=4 THEN 'mois en cours' ELSE 'autre mois' END) as quel_mois; 
-- mois en cours 

--selectionne pour chaque année, le chiffre d'affaire du mois de mars
 SELECT YEAR(date_vente) an ,SUM(CASE WHEN MONTH(date_f)=3 THEN ttc ELSE 0 END) as mars FROM contacts GROUP BY an;
la syntaxe sur les structures conditionnelles MySQL:structures conditionnelles

La seule façon de se familiariser avec ces requêtes c'est de les exécuter dans une console MySQL.

Re: mois et chiffres dans un tableau

par moimeme30 » 04 avr. 2014, 21:09

je vais me pencher un peu dessus, envie de bien le comprendre.
Merci et enfin je peux mettre problème résolu.

bonne soirée à tous

Re: mois et chiffres dans un tableau

par sirakawa » 04 avr. 2014, 20:11

C'est l'équivalent SQl du switch de beaucoup de langages :
ventiler suivant la variable (var) switch ($var) case
{
au cas où elle vaut 1: case 1: when var = 1 then
faire ca; $z = var; z = var
fin du cas; break; else
z = 0
end

C'est plus ou moins un IF

Re: mois et chiffres dans un tableau

par moimeme30 » 04 avr. 2014, 18:08

et dire que je n'ai meme pas pensé à faire ça. pfffff
En tout cas je te remercie encore une fois.
Pour information, c'est bien un opérateur pivot? si c'est bien le cas, connais tu un site en français qui explique le principe?
J'ai cherché, j'ai essayé, mais j comprend pas tout :(

Re: mois et chiffres dans un tableau

par yann18 » 04 avr. 2014, 17:51

Bonjour, je reviens pour une dernière question sur ce code...
Comment je récupère le total en php?
Merci
ben de rien.

Par total j'entends par là le chiffre d'affaire annuel? si c'est le cas il s'agit du 13ème champ dans la requête select.Le premier champ année($mois[0]), le 2ème champ c'est Jan($mois[1]) ...et le 13ème champ sera donc Chiffre_Annuel c-a-d le chiffre d'affaire annuel($mois[13]).

Re: mois et chiffres dans un tableau

par moimeme30 » 04 avr. 2014, 16:07

Bonjour, je reviens pour une dernière question sur ce code...
Comment je récupère le total en php?
Merci

Re: mois et chiffres dans un tableau

par moimeme30 » 03 avr. 2014, 10:58

Ca fonctionne parfaitement, Je te remercie Yann. Bonne journée.

Re: mois et chiffres dans un tableau

par yann18 » 02 avr. 2014, 22:57

tu peux construire un tableau à partir du jeu d'enregistrements issu de la requête:

<?php


$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$tab = array();
while($data = mysql_fetch_array($req) ) {
//construction du tableau à partir du resultat de la requête
$tab[ $data['an'] ] = $data; 
}

//un var_dump pour voir le contenu de $tab
var_dump( $tab );
?>

pour afficher, il suffit de parcourir le tableau construit:

<table>
                                <thead>
                                        <tr>
                                                <th>Année</th>
                                                <th>Janv</th>
                                                <th>Fevr</th>
                                                <th>Mars</th>
                                                <th>Avr</th>
                                                <th>Mai</th>
                                                <th>Juin</th>
                                                <th>Juil</th>
                                                <th>Août</th>
                                                <th>Sept</th>
                                                <th>Oct</th>
                                                <th>Nov</th>
                                                <th>Dec</th>
                                        </tr>
                                </thead>
                                <tbody>
					<?php foreach( $tab as $an=>$mois ) { ?>
                                        <tr>
                                                <th> <?php echo $an ?></th>
                                                <td><?php echo $mois[1];?></td>
                                                <td><?php echo $mois[2];?></td>
                                                <td><?php echo $mois[3];?></td>
						<td><?php echo $mois[4];?></td>
                                                <td><?php echo $mois[5];?></td>
                                                <td><?php echo $mois[6];?></td>
						 <td><?php echo $mois[7];?></td>
                                                <td><?php echo $mois[8];?></td>
                                                <td><?php echo $mois[9];?></td>
						 <td><?php echo $mois[10];?></td>
                                                <td><?php echo $mois[11];?></td>
                                                <td><?php echo $mois[12];?></td>

                                               
                                        </tr>
                                       <?php } ?>
                                </tbody>
                        </table>

Re: mois et chiffres dans un tableau

par moimeme30 » 02 avr. 2014, 20:53

Super, ça fonctionne... sous phpMyAdmin :)
Mais maintenant, je l’intègre comment a mon code php?
$sql = 'select year(date_vente) année,
      	SUM(CASE WHEN MONTH(date_vente) = 1 THEN ttc ELSE 0 END) Jan,    
        SUM(CASE WHEN MONTH(date_vente) = 2 THEN ttc ELSE 0 END) Fev,    
        SUM(CASE WHEN MONTH(date_vente) = 3 THEN ttc ELSE 0 END) Mar,
        SUM(CASE WHEN MONTH(date_vente) = 4 THEN ttc ELSE 0 END) Avril,
      	SUM(CASE WHEN MONTH(date_vente) = 5 THEN ttc ELSE 0 END) Mai,
		SUM(CASE WHEN MONTH(date_vente) = 6 THEN ttc ELSE 0 END) Juin,
		SUM(CASE WHEN MONTH(date_vente) = 7 THEN ttc ELSE 0 END) Juil,
		SUM(CASE WHEN MONTH(date_vente) = 8 THEN ttc ELSE 0 END) Aout,
		SUM(CASE WHEN MONTH(date_vente) = 9 THEN ttc ELSE 0 END) Sept,
		SUM(CASE WHEN MONTH(date_vente) = 10 THEN ttc ELSE 0 END) Oct,
        SUM(CASE WHEN MONTH(date_vente) = 11 THEN ttc ELSE 0 END) Nov,
        SUM(CASE WHEN MONTH(date_vente) = 12 THEN ttc ELSE 0 END) `Dec`, 
		SUM(ttc) as Chiffre_Annuel 
from contacts   group by année ;';
$req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
$data = mysql_fetch_array($req);

 echo $data[0];
Cela ne me renvoi que l'année, soit 2014.

Re: mois et chiffres dans un tableau

par yann18 » 02 avr. 2014, 20:19

le problème venait du fait que le mot Dec est un mot réservé MySQL. donc il faut délimiter le mot Dec par des quotes inversés(`).Par ailleurs tout ce qui est montant(ttc;...) doit être de type decimal ou float pour pouvoir effectuer des calculs:
SELECT year(date_vente) an,
      	SUM(CASE WHEN MONTH(date_vente) = 1 THEN ttc ELSE 0 END) Jan,   
        SUM(CASE WHEN MONTH(date_vente) = 2 THEN ttc ELSE 0 END) Feb,    
        SUM(CASE WHEN MONTH(date_vente) = 3 THEN ttc ELSE 0 END) Mar,
        SUM(CASE WHEN MONTH(date_vente) = 4 THEN ttc ELSE 0 END) Avril,
      	SUM(CASE WHEN MONTH(date_vente) = 5 THEN ttc ELSE 0 END) Mai,
	SUM(CASE WHEN MONTH(date_vente) = 6 THEN ttc ELSE 0 END) Juin,
	SUM(CASE WHEN MONTH(date_vente) = 7 THEN ttc ELSE 0 END) Juil,
	SUM(CASE WHEN MONTH(date_vente) = 8 THEN ttc ELSE 0 END) Avril,
	SUM(CASE WHEN MONTH(date_vente) = 9 THEN ttc ELSE 0 END) Sept,
	SUM(CASE WHEN MONTH(date_vente) = 10 THEN ttc ELSE 0 END) Oct,
        SUM(CASE WHEN MONTH(date_vente) = 11 THEN ttc ELSE 0 END) Nov,
        SUM(CASE WHEN MONTH(date_vente) = 12 THEN ttc ELSE 0 END) `Dec`, 
   	SUM(ttc) as chiffre_affaire_par_an 
FROM contacts   group by an 
le resultat de la requête donne:
résultat de la requête