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 :

Trier un champ alphanumérique


Sujet :

Langage SQL

  1. #1
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut Trier un champ alphanumérique
    Bonjour,

    J'essaie de trier un champ qui représente un code, ça contient comme exemple de données :
    A.1.2
    A.2.3
    A.10
    A.9
    ça trie bien quand il s'agit des chiffres mais dès que le nombre arrive à 10 ou à 100 ça ne se prend plus en considération le nombre avec des zéro comme 10 par rapport à 9 par exemple.
    J'ai cherché sur internet s'il y a des solutions pour ça, mais je n'ai pas trouvé une solution satisfaisante, surtout que les données que j'ai ne sont pas aussi bien organisées que ce que je viens de citer comme exemple
    bref, je viens de penser à une solution, c'est de créer une fonction qui affecte un nombre à chaque alphabet successivement, et de multiplier chaque partie de cette chaine par un nombre qui représentera le niveau qui lui correspond, par exemple pour "A.2.3" récupérer le "A" le multiplier par 1000 puis prendre le 2 le multiplier par 100, puis le 3 et le multiplier par 10 et additionner le tous pour stocker le nouveau code pour chaque ligne pour l'utiliser dans l'ordre de tri.
    Sinon, une autre solution? peut être plus simple

    Merci

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Découper ton code en portions et trier sur les portions.
    Il faut avant tout savoir quelle est la profondeur de ta nomenclature, pour prévoir les découpages correspondants.
    Avec deux niveaux :
    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
    SELECT  code
        ,   CASE
                WHEN POSITION('.' IN code) = 0 
                    THEN code
                ELSE 
                    SUBSTRING(code FROM 1 FOR POSITION('.' IN code) - 1)
            END AS part1
        ,   CASE
                WHEN POSITION('.' IN code) = 0 
                    THEN ""
                WHEN POSITION('.' IN SUBSTRING(code FROM POSITION('.' IN code)  + 1)) = 0 
                    THEN SUBSTRING(code FROM POSITION('.' IN code)  + 1)
                ELSE
                    SUBSTRING(SUBSTRING(code FROM POSITION('.' IN code)  + 1) FROM POSITION('.' IN SUBSTRING(code FROM POSITION('.' IN code)  + 1)) + 1)
            END AS part 2
    FROM    matable
    ORDER BY part1, part2
    (fait rapidement, à vérifier )

  3. #3
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Salut,

    Je travaille sur sql server, j'ai essayé tout à l'heure de traduire ta requête, le position ne marche pas sur ceci je l'ai remplacé par PATINDEX...mais le fait d'utiliser : vous êtes sûr que ça va bien trier?
    parce que j'ai testé le tri en utilisant deux colonnes, mais ça ne marche pas.

    Je viens d'avoir une ptite idée trop simple, j'ai remarqué que le point est trié en première par rapport aux lettres ou au chiffres, du coup j'ai vite pensé à faire, ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    select * from T1 order by replace (code,'0','.')
    bref, faudrait que je teste bien ça demain!
    sinon, je suis ouverte à toute autre proposition

    ++

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 103
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 103
    Points : 28 394
    Points
    28 394
    Par défaut
    Quelle version de SQL Server ?
    Je ne sais plus si ce SGBD autorise l'usage des colonnes calculées dans la clause ORDER BY.
    Mais comme il n'est pas utile de retourner ces résultats de calculs, il est plus judicieux de mettre les expressions directement dans la clause ORDER BY.

  5. #5
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Quelle version de SQL Server ?
    Sql server 2000
    pour ce que j'ai essayé de faire, ça n'avait pas l'air aussi simple...faut me comprendre c'était la fin de la journée
    j'ai dis des bêtises, en fait ça marche bien le order by avec chaque partie à part, mais le problème est que les codes ne sont pas aussi simple que ce que j'ai cité ici la première fois, parfois je me trouve avec des codes de type
    E3.2a, E3.2b,A5.2, A1.1, A4.1, A5.10, A4.9 E.1.5b, F.15c...etc

    j'ai essayé de separer chaque partie à part pour l'utiliser dans le tri
    pour tester :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    select REF_UTIL,
    substring (REF_UTIL,PATINDEX('%[A-Z,a-z]%',REF_UTIL),PATINDEX('%[0-9]%',REF_UTIL)-1 )
    , substring(REF_UTIL,PATINDEX('%[0-9]%',REF_UTIL),PATINDEX('%[A-Z,a-z,0-9].%',REF_UTIL))
    , substring(REF_UTIL,PATINDEX('%.[0-9]%',REF_UTIL)+1,1000)
     from DEP_ETAT_BRD_PRIX_TMP655
    order by 
    substring (REF_UTIL,PATINDEX('%[A-Z,a-z]%',REF_UTIL),PATINDEX('%[0-9]%',REF_UTIL)-1 )
    , substring(REF_UTIL,PATINDEX('%[0-9]%',REF_UTIL),PATINDEX('%[A-Z,a-z,0-9].%',REF_UTIL))
    , substring(REF_UTIL,PATINDEX('%.[0-9]%',REF_UTIL)+1,1000)
    Tant que le type du champ n'est pas numérique et toujours trié comme une chaine de caractère, les nombres ne seront jamais bien triés...
    il faudrai convertir dans ce cas ?

  6. #6
    Membre averti
    Avatar de witch
    Inscrit en
    Mai 2007
    Messages
    346
    Détails du profil
    Informations personnelles :
    Âge : 38

    Informations forums :
    Inscription : Mai 2007
    Messages : 346
    Points : 335
    Points
    335
    Par défaut
    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
    DECLARE    @Sample TABLE
        (
            Data VARCHAR(50)
        )
     
    INSERT    @Sample select REF_UTIL from DEP_ETAT_BRD_PRIX_TMP655
     
     
    SELECT        *
    ,
     
    CASE
                WHEN LEN(PARSENAME('.' + Data, 3)) is null
                    THEN LEN(PARSENAME('.' + Data,2))
     
                ELSE
                    LEN(PARSENAME('.' + Data, 3))
            END --AS part
    ,
            LEN(PARSENAME('.' + Data, 3)) as A ,
            PARSENAME('.' + Data, 3) as B,
            LEN(PARSENAME('.' + Data, 2)) as C,
            PARSENAME('.' + Data, 2) as D,
            LEN(PARSENAME('.' + Data, 1)) as E,
            PARSENAME('.' + Data, 1)   as F
    FROM        @Sample
     
    ORDER BY   
     
     CASE
                WHEN PARSENAME('.' + Data, 3)is null
                    THEN PARSENAME('.' + Data,2)
     
                 ELSE
                    PARSENAME('.' + Data, 3)
                END --AS part
     
            ,
     CASE
                WHEN LEN(PARSENAME('.' + Data, 3)) is null
                    THEN LEN(PARSENAME('.' + Data,2))
     
                 ELSE
                    LEN(PARSENAME('.' + Data, 3))
                END --AS part
            ,
            PARSENAME('.' + Data, 3),
            LEN(PARSENAME('.' + Data, 2)),
            PARSENAME('.' + Data, 2),
            LEN(PARSENAME('.' + Data, 1)),
            PARSENAME('.' + Data, 1)
    Résolu!

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

Discussions similaires

  1. [8.5] Trier des champs dans un ordre bien précis!
    Par Gotch59 dans le forum SAP Crystal Reports
    Réponses: 2
    Dernier message: 25/05/2007, 15h02
  2. select max sur champ alphanumérique ?
    Par clawhammer dans le forum SQL
    Réponses: 3
    Dernier message: 16/10/2006, 15h00
  3. trier un champ calculé dans une dbgrid
    Par blackbird_dream dans le forum Bases de données
    Réponses: 2
    Dernier message: 21/06/2006, 14h47
  4. [PHP-JS] Trier des champs dynamiques
    Par Mehdi Feki dans le forum Langage
    Réponses: 8
    Dernier message: 22/12/2005, 23h39
  5. Réponses: 6
    Dernier message: 28/12/2004, 16h09

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