IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage SQL Discussion :

MAX(x + y) au sein d'une requête


Sujet :

Langage SQL

  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut MAX(x + y) au sein d'une requête
    Bonjour,

    Tout est dans le titre, je voudrais savoir si il est possible de faire une requête comme suit :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    'SELECT MAX(a + b) FROM une_table WHERE (Jour BETWEEN "'.$datedeb.'" and "'.$datefin.'") AND ID_indicateur IN ('.$c.','.$d.')';
    Sachant que $c est l'ID de a et $d est celui de b
    Merci d'avance,

    Cdlt

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    bonjour,

    Oui, bien sûr, c'est possible, si a et b sont des colonnes de la table.

    Mais cette phrase me mets le doute :
    Sachant que $c est l'ID de a et $d est celui de b
    Pouvez-vous détailler un peu ?

  3. #3
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    En clair, voila comment ça se passe. Une table correspond à un équipement.

    Dans chaque table, il y a une colonne date_heure, une ID_indicateur et une colonne valeur.

    Du coup ce que je veux faire c'est pour un jour donné (autrement dit, une plage de temps allant de 0h00 à 23h55 pour un jour donné) calculé le MAX de deux indicateurs (autrement faire le MAX de valeur + valeur) qui ont pour ID (par exemple c et d).

    Pour une meilleure compréhension j'aurais du mettre ID_indicateur in (c,d) ou ID_indicateur IN ($table[$i],$table[$i+1])

    Est ce que c'est un peu plus clair ? ^^

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Une table correspond à un équipement.
    C'est - je pense - une erreur de modélisation...

    Pour votre besoin, (que je ne suis toujours pas sûr d'avoir bien compris, un exemple serait le bienvenu) il vous faudrait plutôt une requête comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    SELECT MAX(C.valeur + D.valeur) AS MaxSomme
    FROM une_table C
    INNER JOIN une_table D
        ON D.ID_indicateur = 'd'
        AND D.Jour BETWEEN '[dateDebut]' AND '[DateFin]'
    WHERE C.ID_indicateur = 'c'
    AND C.Jour BETWEEN '[dateDebut]' AND '[DateFin]'
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT 
        MAX(CASE WHEN ID_Indicateur = 'c' THEN valeur ESLE 0 END)
        + MAX(CASE WHEN ID_Indicateur = 'd' THEN valeur ESLE 0 END) As MaxTotal
    FROM une_table
    WHERE C.ID_indicateur IN ('c', 'd')
    AND Jour BETWEEN '[dateDebut]' AND '[DateFin]'
    Qui ne donneront pas forcément les même résultats dans certains cas (par exemple, si l'un des indicateurs est absent pour la journée)

  5. #5
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    La modélisation des tables est "inamovible" je dois utiliser cette base qui a été faite comme ça .

    Voici un exemple :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    $req2 = select_sql(''.$tableDateEricsson[$i].'','MAX(valeur + valeur) AS max','(date_heure BETWEEN \''.$dateDeb.'\' AND \''.$dateFin.'\') AND ID_indicateur IN ('.$indicateursEricsson[$k].','.$indicateursEricsson[$k+1].')');

    fonction select_sql :
    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    function select_sql($table,$champs,$where)
    {
            if ($where == "")
            {
    	        $sql = 'SELECT '.$champs.' FROM '.$table.'';
    	        $req = mysql_query($sql) or print('<br>Erreur SQL ! '.$sql.'<br>'.mysql_error());
            }
            else
            {
    	        $sql = 'SELECT '.$champs.' FROM '.$table.' WHERE '.$where.'';
    	        //$req = mysql_query($sql) or print('<br>Erreur SQL ! '.$sql.'<br>'.mysql_error());
            }
    //return mysql_fetch_array($req);
    return ($sql);
    }

    Résultat :
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT MAX(valeur + valeur) AS max FROM SG1KEN_SGSN_S07_A2014 WHERE (date_heure BETWEEN '2014-02-10 00:00:00' AND '2014-02-10 23:55:00') AND ID_indicateur IN (36,860)

    Pour ce qui est des indicateurs, par absent vous voulez dire = 0 ?

    Comme je n'ai qu'une table je pense que votre deuxième exemple est pertinent, je vais tester ça tout de suite.

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT MAX(case ID_indicateur when  36 then valeur end)
         + MAX(case ID_indicateur when 860 then valeur end)
      FROM SG1KEN_SGSN_S07_A2014
     WHERE (date_heure BETWEEN '2014-02-10 00:00:00' AND '2014-02-10 23:55:00')
       AND ID_indicateur IN (36,860);

  7. #7
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    326
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Octobre 2013
    Messages : 326
    Points : 156
    Points
    156
    Par défaut
    Ca marche parfaitement avec ceci :

    Code php : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $req3 = 'SELECT MAX(CASE WHEN ID_indicateur = "'.$indicateursEricsson[$k].'" THEN valeur ELSE 0 END) + MAX(CASE WHEN ID_indicateur = "'.$indicateursEricsson[$k+1].'" THEN valeur ELSE 0 END) AS maxTotal
    FROM '.$tableDateEricsson[$i].'
    WHERE ID_indicateur IN ('.$indicateursEricsson[$k].','.$indicateursEricsson[$k+1].')
    AND (date_heure BETWEEN \''.$dateDeb.'\' AND \''.$dateFin.'\')';

    Affichage de la requête :

    SELECT MAX(CASE WHEN ID_indicateur = "29" THEN valeur ELSE 0 END) + MAX(CASE WHEN ID_indicateur = "702" THEN valeur ELSE 0 END) AS maxTotal FROM SG1BEAU_SGSN_S07_A2014 WHERE ID_indicateur IN (29,702) AND (date_heure BETWEEN '2014-02-10 00:00:00' AND '2014-02-10 23:55:00')
    Merci beaucoup pour votre aide !

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 453
    Points : 18 388
    Points
    18 388
    Par défaut
    Si votre colonne ID_indicateur est un entier, vous ne devriez pas mettre de quote dans le case.

    Si vous avez besoin d'une solution avec n indicateurs, il faudra faire ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT sum(valeur)
      FROM ( SELECT ID_indicateur, MAX(valeur) as valeur
               FROM SG1KEN_SGSN_S07_A2014
              WHERE date_heure BETWEEN '2014-02-10 00:00:00' AND '2014-02-10 23:55:00'
                AND ID_indicateur IN (36,860)
           GROUP BY ID_indicateur) AS SR;

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 23/09/2011, 15h30
  2. Déclaration au sein d'une requête
    Par casavba dans le forum SQL
    Réponses: 11
    Dernier message: 14/05/2008, 20h24
  3. Colonne compteur dynamique au sein d'une requête
    Par lacombefr dans le forum Développement
    Réponses: 6
    Dernier message: 16/04/2008, 13h41
  4. Réponses: 3
    Dernier message: 05/09/2006, 15h59
  5. Réponses: 6
    Dernier message: 20/06/2006, 14h49

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo