Pages: 1
- Sujet précédent - Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B - Sujet suivant
#1 Tue 20 January 2009 16:01
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Chers géorézotiens,
Voici ma colle du jour: Quelle syntaxe de requête réaliser afin de trier un champ de façon à obtenir la suite A, B, C... puis AA, AB, AC....BA, BB... ??
Sachant que le contenu de la colonne ID, même si la plupart du temps se limite à 2 caractères, peut atteindre 5 caractères (selon le nombre d'objets)
J'ai pensé à la fonction asc qui transforme les caractères en nombre ascii:
SELECT ID, asc(mid$(ID, 1, 1))+asc(mid$(ID, 2, 1))+asc(mid$(ID, 3, 1))+asc(mid$(ID, 4, 1))+asc(mid$(ID, 5, 1))
FROM Test_tri
ORDER BY col2
INTO Tri
Déjà, c'est pas mal puisque ça me donne A, B, C... puis les "ID" à plusieurs caractères.
Sauf que AB et BA donnent tous les deux 131: asc("A") + asc("B") = asc("B") + asc("A")
Et donc ça donne des confusions à partir du moment où il y a plusieurs.
Une idée?
Si certains veulent s'amuser, je vous ai joint un zip avec une table "type" pour essayer...
Dernière modification par Miss T. (Tue 20 January 2009 16:02)
Hors ligne
#2 Tue 20 January 2009 17:25
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Bonjour
Excellente piste !! Ne reste plus qu'à appliquer la bonne vieille et lourdingue méthode....
asc(mid$(ID, 1, 1))+asc(mid$(ID, 2, 1))*10+asc(mid$(ID, 3, 1))*100+asc(mid$(ID, 4, 1))*1000+asc(mid$(ID, 5, 1))*10000
Hors ligne
#3 Tue 20 January 2009 18:34
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
La piste est bonne mais concrètement, c'est pas de bol:
AA donne 715
BA donne 716
AB donne 725
BB donne 726
...
Hors ligne
#4 Tue 20 January 2009 19:19
- Marc-André
- Participant assidu
- Lieu: Montréal
- Date d'inscription: 30 Sep 2005
- Messages: 688
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Bonjour,
Pourquoi ne pas séparer les lettres simples (A à Z) et les lettres doubles (AA à ZZ)?
Après cela, faire le tri des deux séries ne pose plus de problème. Ensuite, il ne reste qu'à assembler les deux listes avec un copier coller.
Hors ligne
#5 Tue 20 January 2009 19:28
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Bah, c'est juste un mauvais réglage (de ma part)...
Avec: asc(mid$(ID, 1, 1))*10000+asc(mid$(ID, 2, 1))*1000+asc(mid$(ID, 3, 1))*100+asc(mid$(ID, 4, 1))*10+asc(mid$(ID, 5, 1))
AA donne 650000+65000=715000
AB donne 650000+66000=716000
BA donne 660000+65000=725000
BB donne 660000+66000=726000
...et tout rentre dans l'ordre
Hors ligne
#6 Wed 21 January 2009 10:35
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Bien vu Maurice. Ceci dit, avec ta formule, j'ai bien A à G puis AA, AB, AC, puis H puis BA, BB puis I, J, K...:
A 650000
B 660000
C 670000
D 680000
E 690000
F 700000
G 710000
AA 715000
AB 716000
AC 717000
H 720000
BA 725000
BB 726000
I 730000
J 740000
K 750000
Z 900000
Avec les coefs suivants:
asc(mid$(ID, 1, 1))*200+asc(mid$(ID, 2, 1))*100+asc(mid$(ID, 3, 1))*50+asc(mid$(ID, 4, 1))*10+asc(mid$(ID, 5, 1))
on obtient:
A 13000
B 13200
C 13400
...
Y 17800
Z 18000
AA 19500
AB 19600
BA 19700
AC 19700
AD 19800
BB 19800
AE 19900
BC 19900
CA 19900
AF 20000
CB 20000
BD 20000
CC 20100
DA 20100
BE 20100
AG 20100
DB 20200
CD 20200
BF 20200
AH 20200
AI 20300
CE 20300
BG 20300
DC 20300
EA 20300
...
Donc on approche car on a A à Z puis les 2 chiffres.
Mais ça foire toujours avec les lettres doubles (BA = AC, AE = BC = CA, etc)
J'arrête pas de trifouiller ces coefs mais je trouve pas...
Help!
(J'ai mis un plus gros jeu de données en PJ)
Hors ligne
#7 Wed 21 January 2009 11:03
- snaileater
- Participant actif
- Date d'inscription: 5 Nov 2008
- Messages: 121
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Euh ... je suis pas un matheux mais ... asc retourne des valeurs entre 0 et 255 donc :
Il faut se mettre en Base ... 256 non ? afin qu'une "lettre" puisse se comporter comme un chiffre ?
Dernière modification par snaileater (Wed 21 January 2009 11:10)
Hors ligne
#8 Wed 21 January 2009 11:38
- Miss T.
- Participant assidu
- Lieu: En pleine amazonie...
- Date d'inscription: 17 Oct 2005
- Messages: 294
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Heu, les gars, c'était Marc-André qui était dedans.
Pourquoi faire simple quand on peut faire compliqué?
Et voici donc la solution (Tadaaaaam!):
SELECT ID, len(id)
FROM Sans_nom
ORDER BY col2, col1
INTO Tri
browse * from tri
==> On trie par nombre de caractères puis par les caractères eux-mêmes.
Ce qui donne:
A 1
B 1
C 1
...
Z 1
AA 2
AB 2
AC 2
...
BA 2
BB 2
BC 2
...
CA 2
CB 2
CC 2
...
AAA 3
AAB 3
AAC 3
...
ABA 3
ABB 3
ABC 3
ON EST VRAIMENT DES GROSSES BUSES A L'ESPRIT TORDU! (isn't it?)
Bon, allez, c'est résolu.
MapInfo 1 - cerveau humain 0
Hors ligne
#9 Wed 21 January 2009 12:11
- Maurice
- Membre
- Lieu: Montpellier
- Date d'inscription: 5 Sep 2005
- Messages: 5331
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Chapeau Marc-André, j'aurais dû mieux lire ton intervention...
On ne ramait pas dans le bon sens !!
Hors ligne
#10 Wed 21 January 2009 13:48
- Daniel
- Membre
- Lieu: Victoriaville, Québec
- Date d'inscription: 6 Sep 2005
- Messages: 2028
Re: Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B
Bonjour
Québec 1 - France 0
Bon! pour celle-là. Pour le reste, j'avoue... Mais on se débrouille pas pire!!! Bravo! Marc-André!
Allez, bonne journée
Daniel
De retour à la géomatique
Hors ligne
Pages: 1
- Sujet précédent - Requete de tri A, B, C... AA, AB... au lieu de A, AA, AB...B - Sujet suivant