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

MS SQL Server Discussion :

Tri avec la fin en numerique


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Points : 68
    Points
    68
    Par défaut Tri avec la fin en numerique
    Bonjour,
    J'aimerais savoir s'il y a un moyen de trier une colonne, dans une vue, qui contient une chaine alphanumerique mais dont la fin peut être (pas forcément) du numérique.
    Par exemple si ma colonne de tri appelée colonne1 contient :

    Test
    Info.1
    AutreInfo
    Info.2
    Info.3
    Info.10

    en faisant un select avec ORDER BY colonne1, j'obtiens :
    AutreInfo
    Info.1
    Info.10
    Info.2
    Info.3
    Test

    alors que j'aimerais :
    AutreInfo
    Info.1
    Info.2
    Info.3
    Info.10
    Test

    Quelqu'un pourait-il m'aider svp?
    Merci beaucoup d'avance
    Cédric

  2. #2
    Rédacteur

    Avatar de SQLpro
    Homme Profil pro
    Expert bases de données / SQL / MS SQL Server / Postgresql
    Inscrit en
    Mai 2002
    Messages
    21 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Dans une base de données relationnelle, toute attribut (ou colonne) doit contenir une données ATOMIQUE. C'est la première forme normal.
    Dès lors que vous violez les principes mêmes de conception d'une base de données relationnelles, ne vous étonnez pas de la difficulté d'écrire une telle requête. Ne vous as t-on pas déjà dit qu'on ne pouvait additionner des carottes et des choux fleurs ?
    Pour faire cela il faudra à un moment ou un autre, couper en deux votre information. Soit par le biais d'une remodélisation, soit dans la requête elle même.

    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/ * * * * *

  3. #3
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Tu pourrais utiliser un padding de '0'

    1 => 0001
    10 => 0010

    trié ça donne

    0001
    0010


    Ça fait donc 2 fois que l'on t'aura conseillé de modifier la structure de tes données, mais si ce n'est pas possible (parce que tu n'aurais pas le contrôle sur le format et que ce tri serait exigé) il te faudra pas mal chipoter.
    Most Valued Pas mvp

  4. #4
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Points : 68
    Points
    68
    Par défaut
    Bonjour,
    désolé pour le temps de réponse. Effectivement j'avais pensé au padding. C'est peut être la meilleure des solutions. En ce qui concerne l'addition des choux et des carottes je sais bien que c'est pas facile mais quand un client le demande on essaie de le faire quand même....
    Cédric

  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 768
    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 768
    Points : 52 571
    Points
    52 571
    Billets dans le blog
    5
    Par défaut
    Merci de respecter les règles du forum à l'avenir en postant le DDL de votre problème ainsi qu'un jeu d'essais comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    CREATE TABLE Test (colonne1 VARCHAR(32));
    GO
     
    INSERT INTO Test VALUES ('Info.1');
    INSERT INTO Test VALUES ('AutreInfo');
    INSERT INTO Test VALUES ('Info.2');
    INSERT INTO Test VALUES ('Info.3');
    INSERT INTO Test VALUES ('Info.10');
    Voici la réponse à votre demande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    SELECT *
    FROM   Test                     
    ORDER  BY CASE  
              WHEN colonne1 LIKE '%.%' 
                 THEN SUBSTRING(colonne1, 1, PATINDEX('%.%', colonne1) - 1)
              ELSE colonne1
           END,
           CAST(CASE  
                   WHEN colonne1 LIKE '%.%' 
                      THEN SUBSTRING(colonne1, PATINDEX('%.%', colonne1) +1 , LEN(colonne1) - PATINDEX('%.%', colonne1))
                   ELSE '0'
                END AS INT);
    Qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    colonne1
    --------------------------------
    AutreInfo
    Info.1
    Info.2
    Info.3
    Info.10
    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
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Points : 68
    Points
    68
    Par défaut
    Merci beaucoup pour ta réponse. Dès que j'ai l'occasion (car je suis sur autre chose là) je testerai ta solution
    Cédric

  7. #7
    Membre éprouvé

    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Juillet 2006
    Messages : 1 448
    Points : 1 234
    Points
    1 234
    Par défaut
    Attention que sa méthode ne fonctionne que si le . (point) n'est présent au plus une seule fois dans la chaîne et qu'il est suivit par un nombre.

    Et je crains pour toi que ce ne soit pas forcément le cas.
    Most Valued Pas mvp

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    254
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 254
    Points : 68
    Points
    68
    Par défaut
    ha oui tu as raison mais je vais voir en m'en inspirant

Discussions similaires

  1. Problème de tri avec analyse croisée
    Par drthodt dans le forum Access
    Réponses: 2
    Dernier message: 18/10/2005, 16h23
  2. formule de calcul du TRI avec PL/SQL
    Par mongilotti dans le forum Algorithmes et structures de données
    Réponses: 15
    Dernier message: 30/07/2005, 20h23
  3. Pb de tri avec champs vide
    Par nesbla dans le forum Langage SQL
    Réponses: 2
    Dernier message: 01/06/2004, 17h42
  4. tri avec l'ordre UPDATE et incrementation d'une colonne
    Par Staron dans le forum Langage SQL
    Réponses: 3
    Dernier message: 17/02/2004, 08h48
  5. tri avec les champs vides en dernier
    Par r-zo dans le forum Requêtes
    Réponses: 11
    Dernier message: 03/09/2003, 13h40

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