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

Développement SQL Server Discussion :

Sélectionner un enregistrement parmi plusieurs enregistrements [2008]


Sujet :

Développement SQL Server

  1. #1
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut Sélectionner un enregistrement parmi plusieurs enregistrements
    Bonjour,
    Je vais essayer d'être explicite sur ma demande
    Je bloque sur la réalisation d'une requete en sql server.
    Vous trouverez ci dessous, une image ..

    J'ai crée une requête sql toute simple qui m'affiche une liste de BarCode avec un identifiant (champ "Id"). J'ai inséré également un champ ("Nbr_Caractere") qui me donne le nombre de caractère du champ BarCode.
    Le résultat de cette requête me pose un problème. En effet, le champ "Id" peut avoir deux identifiants identiques.
    Pour un identifiant unique , je peux avoir soit un Barcode à 13 caractère ou 28 caractères. Pour ce résultat c'est Ok
    Mais pour 2 identifiants identiques ("Id"), je peux avoir soit un Barcode à 13 caratères ou 28 caractères .Et pour compliquer la tache, pour ces 2 mêmes identifiants ("Id), soit le BarCode à 13 caractères est en première position et le BarCode à 28 caractères en deuxième position ou l'inverse.

    Voici ce que j'essaie de faire :
    Je voudrais que :
    1) Pour un identifiant unique..on ne fait rien: il affiche soir le barceCode à 13 caractère ou à 28 caractères (ligne 2 et 3 de l'image)
    2) Pour deux identifiants identiques, je souhaiterais garder uniquement le BarCode à 13 caratères (ligne 4 et 5 de l'image)

    Nom : BarCode.PNG
Affichages : 215
Taille : 9,2 Ko

    Merci pour votre aide

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

    Comme ceci ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select coalesce(T1.barcod, T2.barcod)
    from ma_table as T1
    left outer join 
         ma_table as T2
      on T2.id=T1.id
     and T2.Nbr_Caractere=28

  3. #3
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    Bonjour,

    Si les codes sur 28 caractères commencent toujours par un % et ceux sur 13 caractères par un caractère alphanumérique, on peut faire aussi :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Id, MIN(BarCode)
    FROM Table
    GROUP BY Id

  4. #4
    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
    et sinon, comme ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    SELECT id
        ,COALESCE(MAX(CASE WHEN LEN(BarCode) = 13 THEN BarCode END), MAX(BarCode)) AS BarCode
    FROM LaTable
    GROUP BY Id

  5. #5
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour à tous,
    Avant tout , merci de vous pencher sur mon problème
    escartefigue et III Jonathan III , vos réponse ne fonctionnent pas malheureusement
    je vais tester celle de aieeeuuuuu et je reviens vers vous

  6. #6
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour aieeeuuuuu
    Ta solution ne fonctionne pas.
    Pourrais tu me dire pourquoi tu selectionne le max du champ barcode ?

  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
    vous dites que les solution ne fonctionnent pas, mais vous n'expliquez pas pourquoi.

    un message d'erreur ? postez le !
    le résultat n'est pas celui attendu, dites ce que vous obtenez et pourquoi ça ne va pas.

    De plus , comme vous avez posté les données sous forme d'image, difficile de tester...

    concernant le MAX dans ma requête, son rôle est de supprimer les lignes à NULL pour le premier (donc les lignes qui ne sont pas un BarCode à 13 caractères), pour deuxième, il ne sert fonctionnellement à rien (car c'est alors qu'on a une seule ligne avec le BarCode sur 28 caractères) mais est nécessaire techniquement car BarCode ne fait pas partie de la clause GROUP BY

  8. #8
    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
    Quel est le type de la colonne BarCode ?

  9. #9
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Effectivement , je vais être plus precis
    Tout d'abord, je vais detailler la requete car je m'apercois que j'ai oublié un détail qui me semble important et qui expliquerait peut etre que les réponses ne fonctionnent pas.
    Vous trouverez ci dessous la requete entière telle que je l'aie construite


    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
    DECLARE @StartDateTime DateTime = '20180320 04:30:00'
    DECLARE @EndDateTime DateTime =   '20180320 12:30:00'
     
     
     
    select 
    Parcel.Id,
    Barcode,
    len(Barcode) as Nbr_Caractere
     
    from Parcel
     JOIN ParcelEvent
               ON Parcel.Id=ParcelEvent.ParcelId AND 
                          (ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime)
    join Barcode
    on Parcel.Id=Barcode.ParcelId and Barcode.Utility in(1,6)
     
    group by
    Parcel.Id,
    Barcode
     
    order by Id
    Comme dis précédemment dans la discussion
    Le résultat de cette requête me pose un problème. En effet, le champ "Id" peut avoir deux identifiants identiques.
    Pour un identifiant unique , je peux avoir soit un Barcode à 13 caractère ou 28 caractères. Pour ce résultat c'est Ok ( ligne1 ou 7 de l'image)
    Mais pour 2 identifiants identiques ("Id"), je peux avoir soit un Barcode à 13 caratères ou 28 caractères (ligne 3 et 4 de l'image)
    Voici ce que j'essaie de faire :

    Je voudrais que :
    1) Pour un identifiant unique..on ne fait rien: il affiche soir le barceCode à 13 caractère ou à 28 caractères (ligne 1 ou 7 de l'image)
    2) Pour deux identifiants identiques, je souhaiterais garder uniquement le BarCode à 13 caratères (sur la ligne 3 et 4 de l'image, je garderais uniquement la ligne 4)

    Dans les propositions faites , j'ai toujours des doublons au niveau du champ Id ( cf ci dessous):
    Nom : Barcode.PNG
Affichages : 213
Taille : 15,6 Ko

  10. #10
    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
    Vous n'expliquez toujours pas ce qui ne va pas dans les solutions que l'on vous a proposée.

    Aussi, postez les requêtes réécrites avec les solutions proposée, vous avez peut-être mal retranscris les solutions proposée pour votre modéle.

  11. #11
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Dans les solutions proposées, pour un même identifiant Id, j'ai toujours les 2 barcodes qui apparaissent dont l'un à 13 caractères et le deuxième à 28 caractères. Alors que j'aurais voulu voir disparaitre le barcode à 28 caractères.
    SI on reprend, l'image du résultat de ma requête, pour l'identifiant -2142196086, je souhaiterais garder uniquement le Barcode à 13 caractères soit le CP170515495FR

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    -2142196086	%005003311556217051549101380	28
    -2142196086	CP170515495FR	13
    Je vous rejoins lorsque vous dites de réécrire les requêtes avec le solutions proposées.
    Je le fais et je reviens vers vous

  12. #12
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 133
    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 133
    Points : 38 556
    Points
    38 556
    Billets dans le blog
    9
    Par défaut
    Voici une solution testée qui fonctionne :

    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
       with MA_TABLE (ID, BARCOD) AS               
           (SELECT 001, 'A23456789.123     '       
            union all                              
            SELECT 001, 'A23456789.12345678'       
            union all                              
            SELECT 002, 'B23456789.12345678'       
            union all                              
            SELECT 003, 'C23456789.12345678'       
            union all                              
            SELECT 004, 'D23456789.123     '       
            union all                              
            SELECT 004, 'D23456789.12345678'       
            union all                              
            SELECT 003, 'C23456789.123     '       
            union all                              
            SELECT 005, 'E23456789.123     '       
            union all                              
            SELECT 006, 'F23456789.12345678'       
           )                                 
       select distinct                       
              case when T2.BARCOD is null    
                   then T1.BARCOD            
                   else T2.BARCOD            
              end as Code_Barre              
       from ma_table as T1                   
       left outer join                       
            ma_table as T2                   
         on T2.id=T1.id                      
        and length(trim(T2.BARCOD))=13       
       order by 1
    Donne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    CODE_BARRE         
    A23456789.123      
    B23456789.12345678 
    C23456789.123      
    D23456789.123      
    E23456789.123      
    F23456789.12345678
    Notez que la colonne longueur que vous avez ajoutée n'est pas nécessaire, puisqu'on peut la caculer

  13. #13
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Bonjour aieeeuuuuu
    Voici la requete définitive avec votre code sql que j'ai rajouté.
    Cette nouvelle requête me donne toujours les 2 barcodes pour un même identifiant
    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 
    Barcode.ParcelId,
    COALESCE(MAX(CASE WHEN LEN(BarCode) = 13 THEN BarCode END), MAX(BarCode)) AS BarCode,
    len(Barcode) as Nbr_Caractere
    FROM Barcode
     
    join Parcel
    on Parcel.Id=Barcode.ParcelId and Barcode.Utility in(1,6)
    JOIN ParcelEvent
               ON Parcel.Id=ParcelEvent.ParcelId AND 
                          (ParcelEvent.[DateTime] BETWEEN @StartDateTime AND @EndDateTime)
     
    GROUP BY 
    Barcode.ParcelId,
    len(Barcode)
     
    order by 
    ParcelId

  14. #14
    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
    a première vue, il faut juste enlever LEN(BarCode) du group BY et donc du SELECT.

    (Si vous voulez a longueur dans le SELECT alors il faut prendre le LEN de la formule complète qui permet de calculer le Bon barCode (COALESCE...)

  15. #15
    Membre habitué
    Homme Profil pro
    Inscrit en
    Juin 2006
    Messages
    101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Seine et Marne (Île de France)

    Informations forums :
    Inscription : Juin 2006
    Messages : 101
    Points : 187
    Points
    187
    Par défaut
    J'ai joué la requête de aieeeuuuu et pour moi elle fait bien le boulot, celle de III Jonathan III le ferait également à ceci près remplacer MIN(BarCode) par MAX(BarCode).
    Comme vous l'a suggéré aieeeuuuu, poster un jeu d'essai complet, Càd création de table, jeu de data, résultat attendu.

  16. #16
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    aieeeuuuuu,
    j'ai supprimé LEN(BarCode) du group BY et du SELECT et là tout fonctionne à merveille
    Bravo.
    Aieeuuu , encore une quetsion:
    Comment tu lirais ton code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    COALESCE(MAX(CASE WHEN LEN(BarCode) = 13 THEN BarCode END), MAX(BarCode))
    ?

  17. #17
    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
    CASE WHEN LEN(BarCode) = 13 THEN BarCode END renvoie le BarCode s'il est de longueur 13, sinon NULL

    Le MAX qui l'entoure, renvoie donc le barCode de longueur 13 dans le groupe s'il y en a un de longueur 13, sinon (si toutes les lignes sont à null suite au CASE, alors il renvoie NULL.

    Et si ce MAX renvoie NULL (donc aucun BarCode de 13 caractères dans le regroupement), alors COALESCE renvoie le deuxième argument, à savoir MAX(BarCode), qui renvoie donc le seul élément du groupe (selon vos règles de gestion) qui est un BarCode sur 28 caractères.

    Donc en résumé, on regroupe sur l'ID, et dans chaque groupe (de une ou deux lignes donc), COALESCE(MAX(CASE WHEN LEN(BarCode) = 13 THEN BarCode END), MAX(BarCode)) renvoie le barcode de 13 caractères s'il existe, sinon celui de 28.

  18. #18
    Membre régulier
    Homme Profil pro
    Chef de projet BI
    Inscrit en
    Août 2013
    Messages
    42
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Chef de projet BI

    Informations forums :
    Inscription : Août 2013
    Messages : 42
    Points : 82
    Points
    82
    Par défaut
    J'avais rapidement testé ma solution et elle était ok.

    Citation Envoyé par LapinClair Voir le message
    J'ai joué la requête de aieeeuuuu et pour moi elle fait bien le boulot, celle de III Jonathan III le ferait également à ceci près remplacer MIN(BarCode) par MAX(BarCode).
    Comme vous l'a suggéré aieeeuuuu, poster un jeu d'essai complet, Càd création de table, jeu de data, résultat attendu.
    Ce message m'a fait douté, j'ai donc réalisé un jeu d'essai à partir des données dont facteur a bien voulu nous faire part dans son image :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    DECLARE @TABLE TABLE (Id INT, BarCode VARCHAR(50));
     
    INSERT @TABLE SELECT 1, '7R0001952887569';
    INSERT @TABLE SELECT 2, '%0073000119A0037599174801250';
    INSERT @TABLE SELECT 3, '%0073000119A0037599174801250';
    INSERT @TABLE SELECT 3, 'CP170515465FR';
    INSERT @TABLE SELECT 4, 'CB313016546FR';
    INSERT @TABLE SELECT 4, '%0083510119A0037599174801250';
     
    SELECT Id, MIN(BarCode) AS BarCode
    FROM @TABLE
    GROUP BY Id
    et j'obtiens le résultat attendu :

    Nom : Capture.PNG
Affichages : 177
Taille : 5,8 Ko

    Je doute pas de ton résultat en utilisant le MAX() LapinClair, mais je me demande à quoi est due cette différence de comportement entre nos deux bases ?

    Je pense que le paramétrage de la collation doit jouer un rôle mais je trouve pas l'info sur le MSDN, si l'un d'entre vous a une explication ou un petit lien sous la main je suis preneur

    EDIT : Ok j'ai rien dit, j'avais mal compris le besoin, le résultat attendu est :


    Nom : Capture.PNG
Affichages : 170
Taille : 5,3 Ko

    Il faut bien utiliser un MAX() du coup.
    Plus besoin de fouiller le net à la recherche de l'ordre alphabétique sur SQL Server

  19. #19
    Membre actif
    Inscrit en
    Avril 2007
    Messages
    1 239
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 1 239
    Points : 213
    Points
    213
    Par défaut
    Merci aieeeuuuuu pour ce complement d'information.
    je ferme la discussion sans oublier aussi de remercier III Jonathan III

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

Discussions similaires

  1. Mise à jour d'un seul enregistrements parmi plusieurs identiques
    Par Christophe Charron dans le forum Développement
    Réponses: 2
    Dernier message: 06/09/2016, 10h55
  2. Réponses: 6
    Dernier message: 02/11/2007, 22h49
  3. Réponses: 6
    Dernier message: 19/09/2006, 18h55
  4. Réponses: 1
    Dernier message: 14/07/2006, 17h23
  5. Sélection d'enregistrement parmis plusieurs identiques
    Par monnoliv dans le forum Décisions SGBD
    Réponses: 2
    Dernier message: 24/09/2005, 15h32

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