[RESOLU] mois et chiffres dans un tableau

Eléphant du PHP | 84 Messages

02 avr. 2014, 16:29

Bonjour à tous.

Je désire créer un tableau faisant afficher mois par mois le C.A enregistré dans ma table.

J'utilise la requête
$sql1 = 'SELECT SUM(ttc) FROM contacts WHERE YEAR(date_vente) = 2014 AND MONTH(date_vente) = 1';
$req1 = mysql_query($sql1) or die('Erreur SQL !<br />'.$sql1.'<br />'.mysql_error());
$data1 = mysql_fetch_array($req1);

$sql2 = 'SELECT SUM(ttc) FROM contacts WHERE YEAR(date_vente) = 2014 AND MONTH(date_vente) = 2';
$req2 = mysql_query($sql2) or die('Erreur SQL !<br />'.$sql2.'<br />'.mysql_error());
$data2 = mysql_fetch_array($req2);

$sql3 = 'SELECT SUM(ttc) FROM contacts WHERE YEAR(date_vente) = 2014 AND MONTH(date_vente) = 3';
$req3 = mysql_query($sql3) or die('Erreur SQL !<br />'.$sql3.'<br />'.mysql_error());
$data3 = mysql_fetch_array($req3);

etc...
pour récupérer les données.

Et pour faire apparaitre:
<table>
				<thead>
					<tr>
						<th></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>
					<tr>
						<th>Marc</th>
						<td><?php echo $data1[0];?></td> 
						<td><?php echo $data2[0];?></td> 
						<td><?php echo $data3[0];?></td> 
						<td><?php echo $data4[0];?></td> 
						<td><?php echo $data5[0];?></td> 
						<td><?php echo $data6[0];?></td> 
						<td><?php echo $data7[0];?></td> 
						<td><?php echo $data8[0];?></td> 
						<td><?php echo $data9[0];?></td> 
						<td><?php echo $data10[0];?></td> 
						<td><?php echo $data11[0];?></td> 
						<td><?php echo $data12[0];?></td> 
					</tr>
					
				</tbody>
			</table>

Jusque la, tout fonctionne nickel.


Mais je ne suis pas sur que ce soit la meilleure façon de faire. cela fait beaucoup de requetes à mon gout.

Quelqu'un a une idée?
Merci de votre future aide

Mammouth du PHP | 571 Messages

02 avr. 2014, 17:29

bonjour,

en une seule requête, tu peux d'abord regrouper par an, puis pour chaque année faire le total de chaque mois
$sql="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) ca_par_an 
FROM contacts   group by an";

Eléphant du PHP | 84 Messages

02 avr. 2014, 17:53

Merci Yann pour ton aide,
mais je n'ai pas bien compris le principe. et surement pour ç que j'ai cette erreur...
Erreur SQL !
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) ca_par_an FROM contacts group by an
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 'Dec, SUM(ttc) ca_par_an FROM contacts group by an' at line 13

Mammouth du PHP | 571 Messages

02 avr. 2014, 18:30

je ne vois pas d'erreurs dans la requête. si tu veux donne moi la structure complète de la table ainsi que les données à insérer pour tester.

Eléphant du PHP | 84 Messages

02 avr. 2014, 18:38

Sympa de prendre du temps pour moi,

Alors pour les données à rentrer, qu'importe, j'en suis à la création. ce qui m'interresse actuellement c'est de sortir la somme par mois de la colonne ttc.

et voici la structure.
--
-- Structure de la table `contacts`
--

CREATE TABLE IF NOT EXISTS `contacts` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `nom` varchar(30) NOT NULL,
  `prenom` varchar(30) NOT NULL,
  `adresse` varchar(200) NOT NULL,
  `cp` varchar(10) NOT NULL,
  `ville` varchar(20) NOT NULL,
  `tel1` varchar(20) NOT NULL,
  `tel2` varchar(20) NOT NULL,
  `email` varchar(100) NOT NULL,
  `produit` varchar(100) NOT NULL,
  `ref` varchar(100) NOT NULL,
  `ttc` varchar(10) NOT NULL,
  `tva` varchar(5) NOT NULL,
  `devis` varchar(30) NOT NULL,
  `remise` varchar(10) NOT NULL,
  `vente` int(1) NOT NULL,
  `relance` int(1) NOT NULL,
  `details1` text NOT NULL,
  `details2` text NOT NULL,
  `details3` text NOT NULL,
  `details4` text NOT NULL,
  `details5` text NOT NULL,
  `details6` text NOT NULL,
  `date` datetime NOT NULL,
  `date_vente` date NOT NULL,
  `date_relance` date NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=9 ;

Mammouth du PHP | 571 Messages

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

Eléphant du PHP | 84 Messages

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.

Mammouth du PHP | 571 Messages

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>

Eléphant du PHP | 84 Messages

03 avr. 2014, 10:58

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

Eléphant du PHP | 84 Messages

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

Mammouth du PHP | 571 Messages

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]).

Eléphant du PHP | 84 Messages

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 :(

Mammouth du PHP | 2278 Messages

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
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

Eléphant du PHP | 84 Messages

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

Mammouth du PHP | 571 Messages

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.