Requête qui totalise selon des critères ?
Résolu
emrh
Messages postés
427
Date d'inscription
Statut
Membre
Dernière intervention
-
emrh Messages postés 427 Date d'inscription Statut Membre Dernière intervention -
emrh Messages postés 427 Date d'inscription Statut Membre Dernière intervention -
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
A voir également:
- Requête qui totalise selon des critères ?
- Maya cherche des mocassins noirs ou rouges en taille 40. filtrez la table selon ses critères. combien y a-t-il de résultats ? - Forum Access
- Requête bloquée par le pare-feu applicatif claranet webfence ✓ - Forum Réseaux sociaux
- Requete sql pix - Forum PHP
- Erreur lors de l'envoi de la requête facebook - Forum Facebook
- Erreur de requete facebook - Forum Facebook
6 réponses
Bonjour,
Voila une idée à affiner
avec la base pour tester je ferais surement une seule requête, sans le sous select et la pseudo table T.
Voila une idée à affiner
SELECT 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 ça
Essaye ça
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 , '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 !
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 :
EDIT : Avec ou sans , à la fin de la ligne array("label"=> $data['ANNEE'], "y"=> $data['ca_total']),

// 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 !
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 !
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/)
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 !
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....
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.. )
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 !
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 !
Merci pour ta requête qui fonctionne, j'ai juste corrigé le S à contrats.date_debut (ligne 3)...
J'ai appris grâce à elle le CASE, WHEN, ELSE et END !
À quoi correspond le 9 dans ELSE 9 d'ailleurs ?
J'aime assez l'idée d'utiliser des WHEN, ELSE et END comme dans n'importe quel autre langage de programmation. Je garde ça en mémoire car je risque d'en avoir besoin prochainement, mille mercis !