Requête qui totalise selon des critères ?

Résolu/Fermé
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 3 juil. 2022 à 19:13
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 - 4 juil. 2022 à 15:58
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 !

// 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

jee pee Messages postés 39643 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 237
Modifié le 3 juil. 2022 à 20:24
Bonjour,

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.

1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
4 juil. 2022 à 07:25
Bonjour Jee Pee,

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 ?
0
jee pee Messages postés 39643 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024 9 237 > emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024
4 juil. 2022 à 09:24
Le 9 correspond à autre que 3, j'aurais pu mettre 99. C'est la même idée que la solution de Jordane45, qui est plus courte,
 IF (P.type = 3 , 'TYPE3', 'TYPEAUTRE') as P_TYPE
1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20 > jee pee Messages postés 39643 Date d'inscription mercredi 2 mai 2007 Statut Modérateur Dernière intervention 26 avril 2024
4 juil. 2022 à 14:09
Merci pour ton temps et pour ta réponse claire !
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 !
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
Modifié le 3 juil. 2022 à 20:30
Bonjour,


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
            


1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
4 juil. 2022 à 07:28
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 !
0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
Modifié le 4 juil. 2022 à 07:56
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']),

0
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
4 juil. 2022 à 07:54
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)
    );
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 juil. 2022 à 08:57
Noormal, tu écras les données dans tes variables....
par exemple.. au lieu de
 $hebergement = array(
            array("label"=> $data['ANNEE'], "y"=> $data['ca_total']),
        );

il faudrait
 $hebergement[] = array(
            array("label"=> $data['ANNEE'], "y"=> $data['ca_total']),
        );
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
4 juil. 2022 à 14:34
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 !
0
jordane45 Messages postés 38145 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 25 avril 2024 4 650
4 juil. 2022 à 15:54
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 !
1
emrh Messages postés 427 Date d'inscription mardi 9 décembre 2014 Statut Membre Dernière intervention 9 avril 2024 20
4 juil. 2022 à 15:58
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 ! ;-)
0