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 sur un SUM


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut MAX sur un SUM
    Bonjour,
    j'ai un petit souci, j'ai besoin de faire un MAX() sur un SUM() dans une requête comportant des jointures.

    Voici le schéma des tables utilisées pour la requête :

    SERVEUR (NUM_SERVEUR, NOM_SERVEUR)
    COMMANDE (NUM_COMMANDE, NUM_TABLE, NUM_SERVEUR, DATE, PRIX_TOTAL)
    CONCERNER(NUM_CONSO, NUM_COMMANDE, QUANTITE)
    CONSOMMATION (NUM_CONSO, NOM_CONSO, PRIX_CONSO)

    Ma requête doit sélectionner le serveur qui a vendu le plus de tel ou tel consommation (NOM_CONSO).

    En essayant ceci, j'ai tous les serveurs avec la quantité totale pour la conso '7up' :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT NOM_SERVEUR, SUM(QUANTITE) AS QTE FROM SERVEUR
    INNER JOIN COMMANDE ON
    SERVEUR.NUM_SERVEUR = COMMANDE.NUM_SERVEUR
    INNER JOIN CONCERNER ON
    COMMANDE.NUM_COMMANDE = CONCERNER.NUM_COMMANDE
    INNER JOIN CONSOMMATION ON
    CONCERNER.NUM_CONSO = CONSOMMATION.NUM_CONSO
    WHERE CONSOMMATION.NOM_CONSO = '7up' GROUP BY NOM_SERVEUR;
    Mais je n'arrive pas à sélectionner seulement celui qui en a vendu le plus.
    J'ai essayé ceci :

    dans la première ligne mais ça ne marche pas.

    J'ai essayé ensuite ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT NOM_SERVEUR, MAX(QTE) FROM 
    (SELECT NOM_SERVEUR, SUM(QUANTITE) AS QTE FROM SERVEUR
    INNER JOIN COMMANDE ON
    SERVEUR.NUM_SERVEUR = COMMANDE.NUM_SERVEUR
    INNER JOIN CONCERNER ON
    COMMANDE.NUM_COMMANDE = CONCERNER.NUM_COMMANDE
    INNER JOIN CONSOMMATION ON
    CONCERNER.NUM_CONSO = CONSOMMATION.NUM_CONSO
    WHERE CONSOMMATION.NOM_CONSO = '7up' GROUP BY NOM_SERVEUR) GROUP BY NOM_SERVEUR;
    Mais ça me donne toujours tous les serveurs avec leurs quantités totales.

    Je voulais essayer ceci (identique au premier essai mais avec un having) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT NOM_SERVEUR, SUM(QUANTITE) AS QTE FROM SERVEUR
    INNER JOIN COMMANDE ON
    SERVEUR.NUM_SERVEUR = COMMANDE.NUM_SERVEUR
    INNER JOIN CONCERNER ON
    COMMANDE.NUM_COMMANDE = CONCERNER.NUM_COMMANDE
    INNER JOIN CONSOMMATION ON
    CONCERNER.NUM_CONSO = CONSOMMATION.NUM_CONSO
    WHERE CONSOMMATION.NOM_CONSO = '7up' GROUP BY NOM_SERVEUR HAVING...;
    Mais je ne sais pas quoi mettre comme fonction et comme opérateur pour le HAVING

    Merci d'avance à celui qui m'apportera un peu d'aide !

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    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 454
    Par défaut
    Effectivement, sauf exception pour un éditeur de SGBD, on ne peut pas combiner deux opération d'agrégats au niveau de la même requête.
    Deux questions toutefois me viennent à l'esprit avant de vous proposer une réponse :
    1. Que souhaitez-vous afficher si deux serveurs ont la même quantité ?
    2. Quel est votre SGBD ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    Merci de ton aide.

    Si deux serveurs ont la même quantité, alors il faut que ces deux serveurs soient affichés.

    J'utilise Oracle.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 779
    Billets dans le blog
    10
    Par défaut
    Bonjour,

    Vous pouvez généraliser la solution en utilisant une fonction de fenêtrage. Ce qui vous permettra, pour chaque consommation, de connaitre le(s) serveur(s) qui a(ont) fait le plus de ventes

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Juin 2012
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2012
    Messages : 29
    Par défaut
    Merci de ton aide.

    Je ne connais pas le fenêtrage, j'ai regardé un peu et je ne comprend pas tout et ça m'embrouille un peu.

    Je suis un cour sur le SQL et j'ai des requêtes à effectuer sur une base. Je pense que mon formateur attends une solution plus proche de ce que j'ai essayé plus haut et je préfère m'en tenir à ça pour le moment. Je ne suis déjà pas super à l'aise avec le SQL, je suis plus débutant qu'autre chose, alors je ne souhaite pas me lancer dans des notions plus complexe qu'on a pas encore vu (et qu'on ne verra peut être pas), en tous cas pour l'instant.
    Je pense qu'il ne doit pas manquer grand chose à mes essais. Je cherche toujours.

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 779
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 779
    Billets dans le blog
    10
    Par défaut
    Auquel cas vous pouvez faire ainsi en utilisant une CTE :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    WITH TMP AS
      (SELECT NOM_SERVEUR, 
              SUM(QUANTITE) AS QTE 
       FROM SERVEUR
       INNER JOIN COMMANDE 
          ON SERVEUR.NUM_SERVEUR = COMMANDE.NUM_SERVEUR
       INNER JOIN CONCERNER 
          ON COMMANDE.NUM_COMMANDE = CONCERNER.NUM_COMMANDE
       INNER JOIN CONSOMMATION 
          ON CONCERNER.NUM_CONSO = CONSOMMATION.NUM_CONSO
       WHERE CONSOMMATION.NOM_CONSO = '7up' 
       GROUP BY NOM_SERVEUR)
     
    SELECT NOM_SERVEUR, QTE
    FROM TMP
    WHERE QTE=(select max(QTE) from TMP)

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

Discussions similaires

  1. simple requête d'un MAX sur un SUM
    Par Anandamine dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/05/2012, 00h36
  2. [Vxi3] Valeur MIN ou MAX d'une SUM sur un indicateur ?
    Par samy37 dans le forum Designer
    Réponses: 5
    Dernier message: 11/08/2011, 19h09
  3. Effectuer MAX() sur SUM()
    Par guigui11 dans le forum MS SQL Server
    Réponses: 5
    Dernier message: 05/10/2006, 18h15
  4. Opérateur max sur du varchar.
    Par kluh dans le forum Access
    Réponses: 4
    Dernier message: 23/11/2005, 21h31
  5. Réponses: 3
    Dernier message: 08/12/2004, 13h58

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