pour que le champ date_vente soit croisé dynamiquement c-a-d que ses ses valeurs(2013,2014,...) se transforment en tête de colonne il faut utiliser une structure de contrôle mysql comme CASE (ou IF).Pour faire simple le résultat('2010','2011',...) du CASE représente dorénavant l'en-tête de colonne:
SELECT produit ,
COUNT(CASE WHEN YEAR(date_vente) = '2010' THEN 1 ELSE NULL END) '2010' ,
COUNT(CASE WHEN YEAR(date_vente) = '2011' THEN 1 ELSE NULL END) '2011' ,
COUNT(CASE WHEN YEAR(date_vente) = '2012' THEN 1 ELSE NULL END) '2012' ,
COUNT(CASE WHEN YEAR(date_vente) = '2013' THEN 1 ELSE NULL END) '2013' ,
FROM contacts WHERE produit <> ''
AND vente =1 GROUP BY produit ORDER BY YEAR(date_f)
Pour ne pas avoir à fixer les années en dur, comme dans l'exemple précédent, tu peux générer les années depuis une année prise comme origine de tes ventes jusqu'à l'année actuelle.
<?php
$now = date('Y'); //année actuelle
$annees = range(2010, $now );//génère les années comprises entre 2010 et l'année actuelle
foreach ( $annees as $annee ) {
echo $annee,'<br>';
}
?>
en parcourant le tableau des années ($annees), on doit pouvoir construire dynamiquement la requête avant de l'exécuter.
$now = date('Y'); //année actuelle
$annees = range(2010, $now );//génère les années comprises entre 2010 et l'année actuelle
$total_par_an='';
foreach ( $annees as $annee ) {
$total_par_an .=",COUNT(CASE WHEN YEAR(date_vente) = '$annee' THEN 1 ELSE NULL END) '$annee' ";
}
$sql="SELECT produit $total_par_an
FROM contacts
WHERE produit <> ''
AND vente =1
GROUP BY produit
ORDER BY YEAR(date_f)
";
//affichage de a requête pour la tester dans phpmyadmin
echo "sql = ", $sql,'<br>';