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

MS SQL Server Discussion :

group by: trouver le record qui correspond


Sujet :

MS SQL Server

  1. #1
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut group by: trouver le record qui correspond
    Bonjour,

    Imaginons une table avec des personnes, leur département et leur salaire. J'aimerais connaître l'ensemble des personnes qui a le plus gros salaire dans chaque département. J'ai trouvé ceci mais ça ne me satisfait que moyennement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT Person,Departement,Salary FROM TableX T1
    JOIN
    (
    SELECT Departement,MAX(Salary) AS Smax FROM TableX GROUP BY Department
    ) T2
    ON T2.Departement=T1.Departement AND T2.Smax=T1.Salary
    N'y a-t-il pas mieux ?
    Merci.

  2. #2
    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 383
    Points
    18 383
    Par défaut
    Si vous êtes en version 2005 ou plus, vous pouvez utiliser une fonction de fenêtrage :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    With TableX_Rank (Person, Departement, Salary, rn) AS
    (
    SELECT Person, Departement, Salary,
           row_number() over(partition by Departement order by salary desc)
      FROM TableX
    )
    SELECT Person, Departement, Salary
      FROM TableX_Rank
     WHERE rn = 1;
    Adaptez la fonction de fenêtrage en fonction de ce que vous souhaitez faire pour les égalités (plusieurs personnes ont le même salaire).

  3. #3
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut


    Super, magnifique !
    On en apprend tous les jours !

    Merci !

    EDIT: mais on ne peut pas en faire une sous-query
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    SELECT * FROM T WHERE id IN
    (
    WITH (...) AS
    ()
    SELECT id FROM ...
    )

  4. #4
    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 383
    Points
    18 383
    Par défaut
    Le WITH est à mettre en début de requête.
    Si vous utilisez le WITH, d'ailleurs écrivez ainsi toutes vos sous-requêtes, c'est plus lisible et factorisé si besoin.

    D'autres informations ici :
    http://www.developpez.net/forums/d87...h-sous-select/

  5. #5
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Re-merci

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

Discussions similaires

  1. [VBA-E]Methode pour trouver une valeur qui apparait plusieur fois
    Par Elstak dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 23/05/2006, 13h11
  2. Trouver une valeur qui n'est pas dans un champ
    Par eric41 dans le forum Requêtes
    Réponses: 6
    Dernier message: 16/05/2006, 16h48
  3. Prendre la page qui correspond au URL fournit
    Par moniphal dans le forum Web
    Réponses: 4
    Dernier message: 28/09/2005, 18h58
  4. Ou trouver les informations qui defile lors du boot ?
    Par piff62 dans le forum Administration système
    Réponses: 2
    Dernier message: 17/03/2005, 17h19
  5. Réponses: 3
    Dernier message: 21/01/2004, 08h47

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