Requête qui totalise selon des critères ?
Résolu
emrh
Messages postés
439
Statut
Membre
-
emrh Messages postés 439 Statut Membre -
emrh Messages postés 439 Statut Membre -
Bonjour à tous,
J'aurais besoin que ma requête, en une seule fois puisse me faire le total par année de 2 types de prestations, celles = à 3 et toutes les autres...
Voici celle qui fonctionne pour 2022 et pour les prestations <>3 mais comment écrire (pour éviter d'avoir à relancer la requête) celle qui ferait le total pour toutes les années présentes (pour l'instant 2022 et 2023) pour les presta = 3 et les presta <>3
Merci d'avance pour vos lumières !
Configuration: Linux / Chrome 103.0.0.0
J'aurais besoin que ma requête, en une seule fois puisse me faire le total par année de 2 types de prestations, celles = à 3 et toutes les autres...
Voici celle qui fonctionne pour 2022 et pour les prestations <>3 mais comment écrire (pour éviter d'avoir à relancer la requête) celle qui ferait le total pour toutes les années présentes (pour l'instant 2022 et 2023) pour les presta = 3 et les presta <>3
Merci d'avance pour vos lumières !
// Connexion à la bdd :
require('connexion.php');
$requete1 = $bdd->query('
SELECT SUM(T.total) AS ca_total
FROM (
SELECT compositions.prix*compositions.quantites AS total,contrats.etat, contrats.date_debut
FROM compositions
INNER JOIN contrats
ON compositions.id_contrat=contrats.id_contrat
INNER JOIN prestations
ON prestations.id_prestation = compositions.id_prestation
WHERE prestations.type<>3) AS T
WHERE T.etat=3 AND YEAR(T.date_debut)=2022
');
$ca2022 = $requete1->fetch();
$ca2022 = ceil($ca2022['ca_total']);
// Hébergement :
$hebergement = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> $ca2022), //<-------------- Fonctionne
array("label"=> "2021", "y"=> 68279),
array("label"=> "2020", "y"=> 30457),
array("label"=> "2019", "y"=> 63977),
array("label"=> "2018", "y"=> 57993),
array("label"=> "2017", "y"=> 49702),
array("label"=> "2016", "y"=> 45493),
array("label"=> "2015", "y"=> 38460)
);
// Restauration :
$restauration = array(
array("label"=> "2023", "y"=> 0),
array("label"=> "2022", "y"=> $ca2022),
array("label"=> "2021", "y"=> 12117),
array("label"=> "2020", "y"=> 697),
array("label"=> "2019", "y"=> 2687),
array("label"=> "2018", "y"=> 0),
array("label"=> "2017", "y"=> 40),
array("label"=> "2016", "y"=> 350),
array("label"=> "2015", "y"=> 200)
);
Configuration: Linux / Chrome 103.0.0.0
6 réponses
-
Bonjour,
Voila une idée à affinerSELECT annee, presta, SUM(T.total) AS ca_total FROM ( SELECT compositions.prix*compositions.quantites AS total, YEAR(contrat.date_debut) as annee, CASE WHEN prestations.type = 3 THEN 3 ELSE 9 END AS presta FROM compositions INNER JOIN contrats ON compositions.id_contrat=contrats.id_contrat INNER JOIN prestations ON prestations.id_prestation = compositions.id_prestation WHERE contrats.etat =3 ) AS T GROUP BY annee, presta
avec la base pour tester je ferais surement une seule requête, sans le sous select et la pseudo table T.
-
Bonjour,
Essaye çaSELECT ANNEE , T.P_TYPE , SUM(T.total) AS ca_total FROM ( SELECT C.prix*C.quantites AS total ,CA.etat , YEAR(CA.date_debut) as ANNEE , IF (P.type = 3 , 'TYPE3', 'TYPEAUTRE') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation ) AS T WHERE T.etat=3 GROUP BY T.ANNEE, T.P_TYPE ORDER BY T.ANNEE DESC
-
Bonjour Jordan,
Merci pour ton aide, ta requête est exactement celle qu'il me fallait ! ;-)
Une fois écrit, ça semble simple ! Elle à le mérite d'être comprise par un débutant comme moi.
Je l'adopte ! -
Avec ta proposition, j'ai bien dans PhpMyAdmin les 2 années 2022 et 2023 pour les prestations HEBERGEMENT et RESTAURATION, mais avec le code que j'ai fait, je n'ai plus que la dernière année de la requête selon le classement ASC ou DESC que j'utilise :
// Connexion à la bdd : require('connexion.php'); $requete1 = $bdd->query(' SELECT ANNEE, T.P_TYPE, SUM(T.total) AS ca_total FROM ( SELECT C.prix*C.quantites AS total,CA.etat, YEAR(CA.date_debut) as ANNEE, IF (P.type = 3 , \'RESTAURATION\', \'HEBERGEMENT\') as P_TYPE FROM compositions C INNER JOIN contrats CA ON C.id_contrat=CA.id_contrat INNER JOIN prestations P ON P.id_prestation = C.id_prestation) AS T WHERE T.etat=3 GROUP BY T.ANNEE, T.P_TYPE ORDER BY T.ANNEE ASC '); while ($data = $requete1->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT") $hebergement = array( array("label"=> $data['ANNEE'], "y"=> $data['ca_total']), ); // Restauration : if($data['P_TYPE']=="RESTAURATION") $restauration = array( array("label"=> $data['ANNEE'], "y"=> $data['ca_total']), ); }
EDIT : Avec ou sans , à la fin de la ligne array("label"=> $data['ANNEE'], "y"=> $data['ca_total']),

-
D'ailleurs, si à la fin de ma boucle WHILE j'ajoute manuellement les années qui n'existent pas dans la bdd
je n'ai plus que les années ajoutées à la main, celle de la boucle WHILE disparaissent !
$hebergement = array( array("label"=> "2021", "y"=> 68279), array("label"=> "2020", "y"=> 30457), array("label"=> "2019", "y"=> 63977), array("label"=> "2018", "y"=> 57993), array("label"=> "2017", "y"=> 49702), array("label"=> "2016", "y"=> 45493), array("label"=> "2015", "y"=> 38460) ); $restauration = array( array("label"=> "2021", "y"=> 12117), array("label"=> "2020", "y"=> 697), array("label"=> "2019", "y"=> 2687), array("label"=> "2018", "y"=> 0), array("label"=> "2017", "y"=> 40), array("label"=> "2016", "y"=> 350), array("label"=> "2015", "y"=> 200) ); -
-
-
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question -
J'ai essayé ta proposition, mais il y à qq chose que je dois mal faire parce que le graphique est
totalement plat, toutes les prestations sont à 0 !while ($data = $requete1->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[] = array( array("label"=> $data['ANNEE'], "y"=> $data['ca_total']), ); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[] = array( array("label"=> $data['ANNEE'], "y"=> $data['ca_total']), ); } }
Le résultat final, selon la doc de CanvasJs devrait être un truc de ce style :
(https://canvasjs.com/php-charts/dynamic-live-column-chart/)<?php $dataPoints = array( array("label"=> "Core 1", "y"=> 20), array("label"=> "Core 2", "y"=> 65), array("label"=> "Core 3", "y"=> 11), array("label"=> "Core 4", "y"=> 5), array("label"=> "Core 5", "y"=> 48), array("label"=> "Core 6", "y"=> 8), array("label"=> "Core 7", "y"=> 2), array("label"=> "Core 8", "y"=> 18) ); ?>
Je me demande si je n'aurais pas intérêt à partir sur qq chose comme ça :
$hebergement .='array("label"=> "' . $data[\'ANNEE\'] . ', "y"=> ' . $data[\'ca_total\']),';
Le problème risque d'être la , en fermeture du dernier enregistrement !-
A mais non.. tu as un array en trop....
while ($data = $requete1->fetch()) { // Hébergement : if($data['P_TYPE']=="HEBERGEMENT"){ $hebergement[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } // Restauration : if($data['P_TYPE']=="RESTAURATION"){ $restauration[] = array("label"=> $data['ANNEE'], "y"=> $data['ca_total']); } }
et puis, pour voir ce que contiennent tes variables et t'assurer qu'elles ont la structure souhaitée.. fais en des var_dump... ou des print_r ( après la boucle.. pas dedans hein.. )
echo "<pre>"; print_r($hebergement); print_r($restauration); echo "</pre>";
PS: On a dérivé sur une question PHP ... on n'est plus en lien avec la question de départ ni le forum .. qui parlait juste d'une requête SQL.
Pour poursuivre cette discussion si tes soucis persistent, merci de recréer une discussion dans le forum php !
-
-
Je teste ça dès que possible et te remercie une fois encore pour tes explications... des vrais cours de programmation !
(Désolé pour le hors sujet, c'est la passion ! ;-)