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 :

Requête avec sélection sur MAX et Rupture par Service


Sujet :

Langage SQL

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    1
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Requête avec sélection sur MAX et Rupture par Service
    Bonjour,

    Soit un fichier d'entrée avec les colonnes
    - n° de service, n° employé , salaire employé (une ligne par employé)

    Comment coder une requête SQL unique pour obtenir un état avec

    - n° de service, moyenne salaire du service, salaire maximum service, n° employé avec ce salaire maxi (une ligne par service)

    En deux requêtes SQL (et deux états distincts ) c'est élémentaire.
    Mais avec une requête je ne sais comment ajouter le n° de l'employé car s'il faut passer par une requête contenant contenant
    GROUP BY N° de SERVICE, N° EMPLOYE
    on n'obtient pas ce qu'il faut.

    Merci d'avance pour toute aide.

  2. #2
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Comme on n'a pas de jeu d'essai en SQL, j'improvise pour les noms de chamsp et de tables :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    CREATE TABLE Employe (
    NUMSER NUMBER(10),
    NUMEMP NUMBER(10),
    SALAIRE NUMBER(10,2));
     
    INSERT INTO Employe VALUES (1, 1, 1500);
    INSERT INTO Employe VALUES (1, 2, 1800);
    INSERT INTO Employe VALUES (2, 3, 2000);
    INSERT INTO Employe VALUES (2, 4, 1700);
    COMMIT;
    La requête suivante retourne une seule ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT MAX(Salaire), AVG(Salaire)
      FROM Employe;
     
    MAX(SALAIRE) AVG(SALAIRE)
    ------------ ------------
            2000         1750
    Donc en faisant une jointure dessus, ça devrait le faire :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT NumSer, NumEmp, Salaire, AVG_Salaire
      FROM Employe INNER JOIN
           (SELECT MAX(Salaire) AS Max_Salaire, AVG(Salaire) AS Avg_Salaire
              FROM Employe) TabSalaire 
                   ON Salaire = Max_Salaire;
     
        NUMSER     NUMEMP    SALAIRE AVG_SALAIRE
    ---------- ---------- ---------- -----------
             2          3       2000        1750

  3. #3
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 849
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Expert bases de données / SQL / MS SQL Server / Postgresql
    Secteur : Conseil

    Informations forums :
    Inscription : Mai 2002
    Messages : 21 849
    Points : 52 975
    Points
    52 975
    Billets dans le blog
    6
    Par défaut
    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    CREATE TABLE T_EMP
    (
     EMP_NUM         INT,
     EMP_SERVICE     VARCHAR(16),
     EMP_SALAIRE     FLOAT
    )
     
    INSERT INTO T_EMP VALUES (1, 'COMPTA', 12345.12)
    INSERT INTO T_EMP VALUES (2, 'COMPTA',  1234.32)
    INSERT INTO T_EMP VALUES (3, 'RH',      8541.16)
    INSERT INTO T_EMP VALUES (4, 'RH',      2563.21)
    INSERT INTO T_EMP VALUES (5, 'RH',     11222.33)
    INSERT INTO T_EMP VALUES (6, 'COMPTA',  5421.59)
     
    SELECT EMP_SERVICE, AVG(EMP_SALAIRE) AS SALAIRE_MOYEN,
           MAX(EMP_SALAIRE) AS SALIARE_MAX, 
          (SELECT EMP_NUM 
           FROM   T_EMP T1
           WHERE  T1.EMP_SERVICE = T.EMP_SERVICE
             AND  T1.EMP_SALAIRE = (SELECT MAX(EMP_SALAIRE)
                                    FROM   T_EMP T2
                                    WHERE  T2.EMP_SERVICE = T.EMP_SERVICE))
           AS EMP_SALAIRE8MAX_SERVICE 
    FROM   T_EMP T
    GROUP  BY EMP_SERVICE
    J'attire l'attention sur le fait que les noms de vos colonnes ne sont pas conforme à la norme SQL et cela risque de vous apporter de GROS ennuis...
    A lire : http://sqlpro.developpez.com/cours/s...age=partie1#L1

    PS : pensez la prochaine fois à respecter ceci : http://www.developpez.net/forums/viewtopic.php?t=32668

    A +

  4. #4
    Xo
    Xo est déconnecté
    Expert confirmé
    Avatar de Xo
    Inscrit en
    Janvier 2005
    Messages
    2 701
    Détails du profil
    Informations personnelles :
    Âge : 51

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 701
    Points : 4 238
    Points
    4 238
    Par défaut
    Citation Envoyé par Kmiecik Sigismond
    - n° de service, moyenne salaire du service, salaire maximum service, n° employé avec ce salaire maxi (une ligne par service)
    Autant pour moi, j'avais raté cette spécif ...

    Mais ça se rectifie :
    - Les Moyenne/Max par Service :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT NumSer, MAX(Salaire), AVG(Salaire)
      FROM Employe
     GROUP BY NumSer;
     
     NUMSER MAX(SALAIRE) AVG(SALAIRE)
    ------- ------------ ------------
          1         1800         1650
          2         2000         1850
    - La requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT NumSer, NumEmp, Salaire, AVG_Salaire
      FROM Employe INNER JOIN
           (SELECT NumSer AS AGR_NumSer, MAX(Salaire) AS Max_Salaire, AVG(Salaire) AS Avg_Salaire
              FROM Employe GROUP BY NumSer) TabSalaire 
    ON Salaire = Max_Salaire AND NumSer = AGR_NumSer;
     
      NUMSER     NUMEMP    SALAIRE AVG_SALAIRE
    -------- ---------- ---------- -----------
           1          2       1800        1650
           2          3       2000        1850

Discussions similaires

  1. [AC-2010] Requête avec sélection sur une date
    Par a6ri3n dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 07/08/2013, 11h31
  2. [XI] problème avec groupe sur un champ trié par origine ?
    Par kikidrome dans le forum SAP Crystal Reports
    Réponses: 6
    Dernier message: 11/04/2007, 15h31
  3. Requêtes avec liaison sur la même table
    Par jessenco dans le forum Requêtes
    Réponses: 10
    Dernier message: 15/01/2007, 01h10
  4. [ODBC] Pb de requète avec jointure sur 2 bases
    Par Invité dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 12/12/2006, 16h46
  5. [Débutant / SQL] Requête avec la fonction MAX
    Par bugmenot dans le forum Access
    Réponses: 3
    Dernier message: 14/04/2006, 10h43

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