[RESOLU] Requête sql automatique

[Compte supprime]
Invité n'ayant pas de compte PHPfrance

13 janv. 2015, 16:19

Bonjour,

J'utilise cette requête qui fonctionne :
SELECT lieu,
                    SUM(CASE WHEN YEAR(date_cpa) = 2007 THEN compt_nb ELSE 0 END) AS "compt_2007",
                    SUM(CASE WHEN YEAR(date_cpa) = 2008 THEN compt_nb ELSE 0 END) AS "compt_2008",
                    SUM(CASE WHEN YEAR(date_cpa) = 2009 THEN compt_nb ELSE 0 END) AS "compt_2009",
                    SUM(CASE WHEN YEAR(date_cpa) = 2010 THEN compt_nb ELSE 0 END) AS "compt_2010",
                    SUM(CASE WHEN YEAR(date_cpa) = 2011 THEN compt_nb ELSE 0 END) AS "compt_2011",
                    SUM(CASE WHEN YEAR(date_cpa) = 2012 THEN compt_nb ELSE 0 END) AS "compt_2012",
                    SUM(CASE WHEN YEAR(date_cpa) = 2013 THEN compt_nb ELSE 0 END) AS "compt_2013",
                    SUM(CASE WHEN YEAR(date_cpa) = 2014 THEN compt_nb ELSE 0 END) AS "compt_2014"
                    FROM CP_ANALYSE, LIEUX
                    WHERE CP_ANALYSE.id_lieu=LIEUX.id_lieu
                    GROUP BY LIEUX.id_lieu;
Son problème, depuis janvier, elle n'est plus suffisante, logique ... Je pourrais tout simplement ajouter une ligne mais je souhaitais savoir si il n'y avait pas moyen de rendre tout ça automatique.
Je souhaiterais qu'elle détecte si la table CP_ANALYSE possède une ligne en 2015, on peut le résoudre en SQL ou je dois passer par du PHP ?

Merci ! ;-)

Mammouth du PHP | 688 Messages

13 janv. 2015, 18:38

tu peux passer par du php pour construire la chaine de la requete sql avec une boucle de 2007 à date('Y')

ViPHP
ViPHP | 2577 Messages

13 janv. 2015, 21:49

SELECT lieu,YEAR(date_cpa),sum(compt_nb)
                    FROM CP_ANALYSE, LIEUX
                    WHERE CP_ANALYSE.id_lieu=LIEUX.id_lieu
                    GROUP BY LIEUX.id_lieu,YEAR(date_cpa);
Et gérer les ruptures sur le lieu pour l'affichage.

Mammouth du PHP | 571 Messages

13 janv. 2015, 23:17

tu peux construire ta requête dynamiquement en itérant sur les années en partant de 2007 à l'année courante.

$sum='';
$origin = new DateTime('2007-01-13');

$now= new DateTime();//date actuelle
$now->modify( '+1 year' );//+1 an à la date actuelle
$interval = new DateInterval('P1Y');
$daterange = new DatePeriod($origin, $interval ,$now);

foreach($daterange as $date){
$currentYear=$date->format('Y');

$sum.=",SUM(CASE WHEN YEAR(date_cpa) = $currentYear THEN compt_nb ELSE 0 END) AS 'compt_$currentYear'";
}
   $query="SELECT lieu $sum  FROM CP_ANALYSE, LIEUX WHERE CP_ANALYSE.id_li";


Je souhaiterais qu'elle détecte si la table CP_ANALYSE possède une ligne en 2015, on peut le résoudre en SQL ou je dois passer par du PHP ?
si la ligne 2015 n'est pas présente, alors le total pour 2015 sera 0(zéro) ce qui est logique par rapport à ta requête.

[Compte supprime]
Invité n'ayant pas de compte PHPfrance

14 janv. 2015, 09:55

Bonjour,

Merci pour vos réponses !

Avec ton code yann18, je me demandais si il n'était pas plus simple de lancer une première requête qui me donne le MIN et le MAX des années disponibles dans CP_ANALYSE.
Et ensuite, avec cet intervalle, je gère la boucle pour créer la variable $sum et lancer la 2ème requête ?

Merci.

[Compte supprime]
Invité n'ayant pas de compte PHPfrance

14 janv. 2015, 17:55

En attendant, j'ai mis le bout de code en pratique.

Il fonctionne, j'ai juste enlevé cette ligne :
$now->modify( '+1 year' );//+1 an à la date actuelle
Sinon, il m'ajoute 2016.

Merci !