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 :

Sélectionner X lignes selon un autre champ


Sujet :

Langage SQL

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut Sélectionner X lignes selon un autre champ
    Bonjour,

    J'ai à ma disposition SQL Server 2000 ou 2005 et j'ai une petite question SQL :

    J'ai ce jeu de données :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    Agence	Client
    1	A
    1	B
    1	C
    2	C
    2	A
    2	B
    3	B
    3	C
    3	A
    Je voudrais mettre dans une nouvelle table les 2 premiers clients de chaque agence, cela doit donner :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Agence	Client
    1	A
    1	B
    2	C
    2	A
    3	B
    3	C
    Je me bats avec les fonctions TOP et GROUP BY mais je n'y arrive pas. Je sens une solution simple mais je n'arrive pas à mettre le doigt dessus.

    Pourriez-vous m'aider ?

    Merci beaucoup.

  2. #2
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Salut !

    SQL Server dispose des fonction analytiques (plus sûr si c'est déjà à partir de 2000 cela dit) :
    => Cela te permet de numéroter tes lignes selon un ordre défini pour chaque partition (groupe)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT agence, client
    FROM (
        SELECT agence, client, row_number() over(partition by agence order by client) rn
        FROM agence
    ) t
    WHERE rn <= 2

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    À partir de 2005 pour les fonctions de fenêtrage chez SQL-Server.

    Par contre, il manque la donnée qui permet de définir "les deux premiers".
    Dans l'exemple de pacmann, les données ont été triées par nom du client, mais dans l'exemple présenté ce n'est pas le cas.

    Il manque donc la colonne qui permettra d'effectuer ce tri, une date par exemple.

  4. #4
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Merci pour la rapidité de vos 2 réponses.

    Pour Waldar, effectivement, pour simplifier l'exemple, j'ai trié les données comme je le voulais donc il n'y avait plus qu'à piocher dedans mais sur le principe, oui, il faut rajouter une 3ème colonne pour trier les clients.

    Pour pacmann, mon analyseur de requêtes SQL ne reconnaît pas la fonction row_number : 'row_number' n'est pas un nom de fonction reconnu.
    Je viens d'essayer avec la fonction IDENTITY(INT, 1, 1) mais cela numérote toute la table d'un coup sans faire de distinction par agence.

    Merci à vous.

  5. #5
    Membre émérite Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Points : 2 845
    Points
    2 845
    Par défaut
    Oui comme dit Waldar, la fonction n'est disponible qu'à partir de SQL Server 2005...

    Tu peux faire un truc qui rame, du genre

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    SELECT a.agence, a.client
    FROM agence a
    WHERE 2 > (SELECT count(*) 
               FROM agence b 
               WHERE a.agence = b.agence 
                 AND a.colonnetri > b.colonnetri)
    A noter que si ta colonne de tri te donne des ex-aequo, ça va te ramener moins de lignes...
    (tu peux alors changer la condition en
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
           WHERE a.agence = b.agence 
                 AND a.client <> b.client
                 AND a.colonnetri >= b.colonnetri
    ... mais là ça t'en ramènera potentiellement de trop en cas d'égalité)

    (c'est ma photo)
    Paku, Paku !
    Pour les jeunes incultes : non, je ne suis pas un pokémon...

    Le pacblog : http://pacmann.over-blog.com/

  6. #6
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    5
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 5
    Points : 3
    Points
    3
    Par défaut
    Tu es au TOP pacmann, ça marche du feu de dieu ! =D

    Merci à vous pour la rapidité.

  7. #7
    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

    Pour ce type de requête, il vrai que la version 2005 apporte des améliorations non négligeables. Dans votre cas, un CROSS APPLY (disponible également depuis 2005) est tout indiqué :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    SELECT 
        a.agence,
        T.nom
    FROM agence a
    CROSS APPLY (
        SELECT TOP(2) 
            c.nom
        FROM Client c
        WHERE c.id_agence = a.id_agence
        ORDER BY Nom
    )T

    Avec un index sur Client(id_agence, nom), cela peut donner des résultats très satisfaisants !

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

Discussions similaires

  1. Dernières entrées selon un autre champ
    Par kosowski dans le forum Langage SQL
    Réponses: 9
    Dernier message: 31/12/2009, 08h47
  2. [AC-2003] Comment rendre champ inaccessible selon réponse autre champs?
    Par Souriane dans le forum IHM
    Réponses: 7
    Dernier message: 27/11/2009, 21h05
  3. Réponses: 3
    Dernier message: 09/02/2009, 21h18
  4. Trier des lignes sur un autre champ que celui du groupe
    Par tatayoyo dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 28/01/2009, 19h37
  5. Affichage données selon un autre champ : Requête ou VBA?
    Par Noemy23 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 03/07/2007, 13h13

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