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

Firebird Discussion :

Afficher une ligne qu'une seule fois


Sujet :

Firebird

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 183
    Points : 62
    Points
    62
    Par défaut Afficher une ligne qu'une seule fois
    Bonsoir à tous,

    Je cherche à faire une sélection sur une table comme suivant :

    Select ID, NID, Nom, Prenom ... From Client

    Résultat
    1 1 Martin Paul
    2 2 Dupont Olivier
    3 2 Toto Marc

    Je souhaite que le résultat du champ NID ne soit pas répété
    1 1 Martin Paul
    2 2 Dupont Olivier

    J'ai essayé Distinct, il m'affiche les 3 lignes



    Pourriez vous m'aider SVP

  2. #2
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut fveto.

    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
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    CREATE DATABASE '..\Data\Base.fdb' page_size 4096 DEFAULT CHARACTER SET WIN1252;
     
    -- ===========================
    -- Création de la table 'test'
    -- ===========================
     
    create table test (
      id      integer generated by default as identity not null,
      nid     smallint                                 not null,
      nom     varchar(10)                              not null,
      prenom  varchar(10)                              not null,
      primary key (id)
    );
     
    -- =====================
    -- Insertion dans 'test'
    -- =====================
     
    insert into test (nid,nom,prenom) values (1, 'Martin',    'Paul');
    insert into test (nid,nom,prenom) values (2, 'Dupond',    'Olivier');
    insert into test (nid,nom,prenom) values (2, 'Toto',      'Marc');
    insert into test (nid,nom,prenom) values (3, 'Grandjean', 'Léon');
    insert into test (nid,nom,prenom) values (3, 'Durand',    'Albert');
    insert into test (nid,nom,prenom) values (3, 'Smith',     'John');
     
    -- ================
    -- Vidage de 'test'
    -- ================
     
    select  *
      from  test;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               2       2 Dupond     Olivier
               3       2 Toto       Marc
               4       3 Grandjean  Léon
               5       3 Durand     Albert
               6       3 Smith      John
     
     
    -- ===========
    -- Requête N°1
    -- ===========
     
    select      t1.*
          from  test as t1
    inner join  (  select  nid,
                           min(id) as id
                     from  test
                 group by  nid
                ) as t2
            on  t2.id = t1.id;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               2       2 Dupond     Olivier
               4       3 Grandjean  Léon
     
     
    -- ===========
    -- Requête N°2
    -- ===========
     
    select      t1.*
          from  test as t1
    inner join  (  select  nid,
                           max(id) as id
                     from  test
                 group by  nid
                ) as t2
            on  t2.id = t1.id;
     
              ID     NID NOM        PRENOM
    ============ ======= ========== ==========
               1       1 Martin     Paul
               3       2 Toto       Marc
               6       3 Smith      John
     
     
    exit;
     
    Appuyez sur une touche pour continuer...
    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    183
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 183
    Points : 62
    Points
    62
    Par défaut
    Bonjour Artemus,

    Grand merci !!!

    ça fonctionne à merveille.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    De nombreuses solutions sont possibles : fonction d'agrégation comme proposé par Artemus, fonction OLAP, test d'existence...
    Mais il faut surtout donner la règle gestion qui permet de déterminer quelle ligne conserver en cas de double

    Voici plusieurs solutions possibles :
    -1- avec Min ou Max
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       select ID                 
            , NID                
            , NOM                
            , PRENOM             
       from CLIENT T1            
       where ID=                 
            (select MIN(ID)      
             from CLIENT T2      
             where T2.NID=T1.NID)
       order by ID               
              , NOM
    -2- avec un test d'existence
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
       select ID                   
            , NID                  
            , NOM                  
            , PRENOM               
       from CLIENT T1              
       where not exists            
            (select 1              
             from CLIENT T2        
             where T2.NID=T1.NID   
               and T2.ID<T1.ID)    
       order by ID                 
              , NOM
    -3- avec une jointure outer
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
       select T1.ID                  
            , T1.NID                 
            , T1.NOM                 
            , T1.PRENOM              
       from CLIENT T1                
       left join CLIENT T2           
         on T2.NID=T1.NID            
        and T2.ID <T1.ID             
       where T2.ID is null           
       order by T1.ID                
              , T1.NOM
    -4- avec une fonction fenêtrée
    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
       select T1.ID                                   
            , T1.NID                                  
            , T1.NOM                                  
            , T1.PRENOM                               
       from CLIENT T1                                 
       inner join                                     
            (select ID                                
                  , NID                               
                  , row_number()                      
                    over(partition by NID             
                         order by ID asc) as RANG     
             from CLIENT                              
            ) as T2                                   
          on T2.ID  =T1.ID                            
         and T2.NID =T1.NID                           
         and T2.RANG=1                                
       order by T1.ID                                 
              , T1.NOM
    Sans doute y en a -t- il d'autres

  5. #5
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut à tous.

    En effet, Escartefigue a raison car il existe plusieurs solutions à ce problème.
    Je suis parti de l'idée de sélectionner les lignes entières.
    D'où la sous-requête qui va récupérer l'identifiant soit le premier, ou soit le dernier selon les multiples valeurs identiques de votre colonne nid.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    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 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Salut Artemus,

    Nos messages se sont croisés, je viens juste de publier plusieurs solutions possibles en éditant mon post précédent

  7. #7
    Expert éminent sénior Avatar de Artemus24
    Homme Profil pro
    Agent secret au service du président Ulysses S. Grant !
    Inscrit en
    Février 2011
    Messages
    6 380
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Agent secret au service du président Ulysses S. Grant !
    Secteur : Finance

    Informations forums :
    Inscription : Février 2011
    Messages : 6 380
    Points : 19 062
    Points
    19 062
    Par défaut
    Salut Escartefigue.

    Oui, vous avez raison d'enrichir avec d'autres solutions ce sujet.

    Comme je le suppose, fveto doit être débutant et je n'ai pas complexifier à outrance la solution qu'il recherche.
    C'est pourquoi, j'ai indiqué une solution, la plus basique, en fonction du peu d'information que fveto nous a communiqué.

    @+
    Si vous êtes de mon aide, vous pouvez cliquer sur .
    Mon site : http://www.jcz.fr

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 18/01/2015, 18h30
  2. Afficher les données d'une ligne d'une ListView dans des TextBox
    Par amimarcellin dans le forum Accès aux données
    Réponses: 0
    Dernier message: 05/05/2014, 11h02
  3. [WD18] Metre une colonne d'une Table sur une ligne d'une autre Table
    Par Totophe2 dans le forum WinDev
    Réponses: 2
    Dernier message: 22/11/2013, 12h58
  4. Réponses: 4
    Dernier message: 15/10/2009, 13h33
  5. Afficher le résultat d'une requête sur une ligne
    Par cmako dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 12/08/2008, 14h37

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