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 :

Concaténer un numéro en cas du doublon


Sujet :

Langage SQL

  1. #1
    Membre régulier
    Homme Profil pro
    test
    Inscrit en
    Mai 2016
    Messages
    343
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Algérie

    Informations professionnelles :
    Activité : test
    Secteur : Boutique - Magasin

    Informations forums :
    Inscription : Mai 2016
    Messages : 343
    Points : 121
    Points
    121
    Par défaut Concaténer un numéro en cas du doublon
    bonjour a tous

    je posséde un table employer qui contient deux colonnes First_name + last_name , j'ai besoin de récupérer le premier lettre du first_name et le concaténer avec le premier lettre du

    last_name jusqu'à maintenant tout est simple avec substring mais ce que je veux en plus c'est d'ajouter un numéro en cas d'avoir un résulat doublant

    voir l'imprime écran
    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
     
    Create table #user
    ( 
    ID int identity (1,1) ,
    FirstName varchar(40),
    LastName varchar(50) 
    );
     
    insert into #user values('Abdallah','sihem')
    insert into #user values('sofien','ali')
    insert into #user values('amir','smir')
    insert into #user values('sofien','ali')
    insert into #user values('Nabil','mane')
     
     
    select substring(FirstName,1,1)+substring(LastName,1,1)  from #user
    j'ai pensser a row_number mais je ne connais pas comment l'intégrer

    merci pour l'aide de nos experts
    Images attachées Images attachées  

  2. #2
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Bonjour,

    C'est une question très intéressante, mais qui en soulève une autre : est-ce que tu as besoin que cette information soit persistante au cours du temps et déterministe ?

    Déterministe, dans le sens où si tu exécutes 50 fois la requête d'affilés, tu auras toujours le même résultat.
    Persistante, dans le sens où si tu exécutes cette requête 2 fois à 1 an d'intervalle, tu veux être sûr que si le résultat était "as1" alors qu'il reste "as1".

    Ces deux aspects changeront complètement la méthode à mettre en oeuvre...
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  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 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Une solution :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT U.ID, SUBSTRING(U.FirstName,1,1) + SUBSTRING(U.LastName,1,1) AS Initiale,
           CASE COUNT(UU.ID) 
              WHEN 0 THEN SUBSTRING(U.FirstName,1,1) + SUBSTRING(U.LastName,1,1)
              ELSE SUBSTRING(U.FirstName,1,1) + SUBSTRING(U.LastName,1,1) + CAST(COUNT(UU.ID) AS VARCHAR(32)) 
           END AS New_Name
    FROM   #user AS U
           LEFT OUTER JOIN #user AS UU
                ON U.ID > UU.ID AND SUBSTRING(U.FirstName,1,1) + SUBSTRING(U.LastName,1,1) = SUBSTRING(UU.FirstName,1,1) + SUBSTRING(UU.LastName,1,1)
    GROUP  BY U.ID, SUBSTRING(U.FirstName,1,1) + SUBSTRING(U.LastName,1,1)
    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    ID          Initiale New_Name
    ----------- -------- ---------------
    1           As       As
    5           Nm       Nm
    3           as       as
    2           sa       sa
    4           sa       sa1
    A +


    Pour info c'est un exercice que j'ai donné ici : http://sqlpro.developpez.com/Exercic...e=part-3#LIV-F
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    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 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Une solution :
    Ca m'étonnerai que ca donne le résultat attendu

    Essayez plutôt ceci :
    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
    WITH XTAB (XIDT, XNOM, XPRN, XTRG) AS (                                 
         SELECT ID                                                     
              , FirstName
              , LastName
              , SUBSTR(FirstName, 01, 01)!!SUBSTR(LastName, 01, 01)            
         FROM   Tuser
         ORDER BY 4)                                                        
     
    SELECT  CASE WHEN T.RANG=1                                              
                 THEN T.XTRG                                                
                 ELSE T.XTRG !! CAST(T.RANG-1 AS CHAR(03))                  
            END                                                             
    FROM (                                                                  
          SELECT  XTRG                                                      
               ,  ROW_NUMBER()                                              
                  OVER (PARTITION BY XTRG ORDER BY XTRG) AS RANG            
          FROM XTAB                                                         
         ) AS T                                                             
     ;
    La question de Dorinf reste d'actualité

  5. #5
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 759
    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 759
    Points : 52 538
    Points
    52 538
    Billets dans le blog
    5
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Ca m'étonnerai que ca donne le résultat attendu

    Essayez plutôt ceci :
    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
    WITH XTAB (XIDT, XNOM, XPRN, XTRG) AS (                                 
         SELECT ID                                                     
              , FirstName
              , LastName
              , SUBSTR(FirstName, 01, 01)!!SUBSTR(LastName, 01, 01)            
         FROM   Tuser
         ORDER BY 4)                                                        
     
    SELECT  CASE WHEN T.RANG=1                                              
                 THEN T.XTRG                                                
                 ELSE T.XTRG !! CAST(T.RANG-1 AS CHAR(03))                  
            END                                                             
    FROM (                                                                  
          SELECT  XTRG                                                      
               ,  ROW_NUMBER()                                              
                  OVER (PARTITION BY XTRG ORDER BY XTRG) AS RANG            
          FROM XTAB                                                         
         ) AS T                                                             
     ;
    La question de Dorinf reste d'actualité
    Ben là ça fonctionnera pas du tout puisque tu met un ORDER BY dans la première sous requête !!!!

    A +
    Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
    Le site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
    Blog SQL, SQL Server, SGBDR : http://blog.developpez.com/sqlpro
    Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
    Entreprise SQL SPOT : modélisation, conseils, audit, optimisation, formation...
    * * * * * Expertise SQL Server : http://mssqlserver.fr/ * * * * *

  6. #6
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    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 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par SQLpro Voir le message
    Ben là ça fonctionnera pas du tout puisque tu met un ORDER BY dans la première sous requête !!!!

    A +
    Non seulement ça fonctionne, mais j'ai testé et vérifié le résultat avec un jeu d'essai
    PS : vous avez corrigé votre requête entre temps du coup mon commentaire sur cette solution ne s'applique plus

  7. #7
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Non seulement ça fonctionne, mais j'ai testé et vérifié le résultat avec un jeu d'essai
    Attention, ça ne va pas fonctionner sous n'importe quel SGBD. Je sens venir que tu as utilisé MySQmerde

    Sous SQLServer par exemple, la requête n'est pas valide. Elle le serait si on précisait un TOP(n) par exemple.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 129
    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 129
    Points : 38 540
    Points
    38 540
    Billets dans le blog
    9
    Par défaut
    Testé avec DB2 for Z/OS
    Le tri de la CTE n'est pas nécessaire, je l'avais ajouté pour vérifier le résultat du vidage de la CTE et j'ai oublié de l'enlever
    On peut le supprimer puisque le tri est fait dans la fonction de fenêtrage

  9. #9
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 757
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 697
    Points
    10 697
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    Testé avec DB2 for Z/OS
    Dommage, j'ai raté mon coup ! Je voyais déjà SQLPro sortir son expression favorite. Ce sera pour une prochaine fois
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

Discussions similaires

  1. [AC-2003] mise à jour d'une ligne dans le cas des doublon
    Par radahm dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 11/06/2009, 08h30
  2. Concaténer texte avant le retrait des doublons
    Par inka1977 dans le forum Langage SQL
    Réponses: 10
    Dernier message: 11/08/2008, 17h40
  3. Couleur cellule en cas de doublon
    Par NEC14 dans le forum Macros et VBA Excel
    Réponses: 6
    Dernier message: 07/08/2008, 14h53
  4. [MySQL] in_array pour éviter les cas de doublons
    Par Pampa92 dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 11/07/2008, 15h08
  5. Réponses: 2
    Dernier message: 13/02/2007, 12h13

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