Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
2856 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requete sql: classer par ordre alpha en commencant par une lettre donn

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

requete sql: classer par ordre alpha en commencant par une lettre donn

n°1560978
kakahn
Posté le 16-05-2007 à 10:32:14  profilanswer
 

bonjour,
 
je cherche a effectuer une requête qui va me classé les différents entreprises de ma bdd par ordre alphabétique mais à partir d'une lettre tiré préalablement aléatoirement. et par adhésion à une organisation.
 
 
 
Par exemple dans ma table j'ai:
 
Entreprise adhésion 1 pour adhérer et 0 pour non adhérent.
 
tttttttttttt 1
oooooooooo 0
nnnnnnn 0
fffffff 1
aaaaaaa 1
xxxxxx 1
mmmmmm 0
 
 
PAr exemple la lettre générée aléatoirement est: M la requete doit donc m'afficher :
 
tttttttttttt
xxxxxx
aaaaaaa
fffffff
mmmmmm
nnnnnnn
oooooooooo
 
elle classe d'abord les adhérent en commencent par la lettre générée puis les non adhérent par ordre alpha à partir de A
 
J'espère avoir été assez clair
 
Donc je cherche de l'aide, des pistes etc pas la réponse s'il vous plaît
 
merci d'avance.

mood
Publicité
Posté le 16-05-2007 à 10:32:14  profilanswer
 

n°1561134
olivthill
Posté le 16-05-2007 à 13:56:51  profilanswer
 

Citation :

J'espère avoir été assez clair

Désolé, mais il manque le nom de la base de données (MySQL, Oracle, Access, ..., ?), et il manque une explication sur le lien entre la lettre aléatoire et les champs (pourquoi associer "M" et "tttttttttttt" ? je m'attendais à avoir un lien entre "M" et "MMM" ou "Mtt" ou "tttMttt", mais je ne vois pas de lettre "M" dans "tttttttttttt" ).

n°1561346
kakahn
Posté le 16-05-2007 à 17:32:47  profilanswer
 

Désolé j'ai bien avancé mais j'ai toujours besoin d'aide Voici un descriptif de ma situation.
J'utilise Mysql/sql.
 

Code :
  1. Table: entreprises
  2. entreprise - adherent
  3. cccc              1
  4. pppp              1
  5. aaaa              0
  6. rrrrr                1
  7. eeee               0
  8. tttt                0
  9. yyyy              1
  10. zzzz               1
  11. bbbb              0
  12. hhh                1


 
Ma requete a un peu évolué

Code :
  1. SELECT * ,
  2. CASE entreprises
  3. WHEN upper( substring( entreprises, 1, 1 ) ) < 'f'
  4. THEN '1'
  5. WHEN upper( substring( entreprises, 1, 1 ) ) > 'f'
  6. THEN '0'
  7. END AS ORDRE_AFFICHAGE
  8. FROM entreprises
  9. WHERE produits LIKE '%9%'
  10. ORDER BY ORDRE_AFFICHAGE DESC , entreprises
  11. LIMIT 0 , 15


 
Voila le resultat devrait etre :
 

Code :
  1. Table: entreprises
  2. entreprise - adherent - ORDRE_AFFICHAGE
  3. pppp              1                    1
  4. rrrrr                1                    1
  5. yyyy              1                    1
  6. zzzz               1                    1
  7. cccc              1                    1
  8. hhh                1                    1
  9. aaaa              0                     0
  10. bbbb              0                     0
  11. eeee              0                     0
  12. tttt                0                    0


 
J'explique il classe à partir de la lettre f..... (cette lettre est normalement générée aléatoirement)
d'abord les adhérents puis à partir de la lettre a les non adhérents
C'est pour afficher aléatoirement les adhérents en premier page puis les non adhérents
 
mais moi avec ma requete il affiche :

Code :
  1. Table: entreprises
  2. entreprise - adherent - ORDRE_AFFICHAGE
  3. pppp              1                    1
  4. rrrrr                1                    1
  5. tttt                0                    0
  6. yyyy              1                    1
  7. zzzz               1                    1
  8. aaaa              0                     0
  9. bbbb              0                     0
  10. cccc              1                    1
  11. eeee              0                     0
  12. hhh                1                    1


il classe par ordre alpha à partir de f mais pas par adhérent.
 
Une solution serait donc d'intégrér une seconde condition dans le when pour dire SI au dessus de F et adhérent etc mais j'arrive pas a intégrer un AND. J'obtiens à chaque fois une erreur.
 
Aidez moi s'il vous plaît ca fait des heures que je cherche :bug:


Message édité par kakahn le 16-05-2007 à 17:43:02
n°1561395
MagicBuzz
Posté le 16-05-2007 à 19:31:57  profilanswer
 

Un truc comme ça ?
 

Code :
  1. SELECT nom, adherent
  2. FROM entreprise
  3. ORDER BY adherent DESC, sign(ascii(upper(substring(nom, 1, 1))) - ascii('M') + .1) DESC, nom


 
PS : Codé sous SQL Server 2005 Express. Le nom des fonctions et leurs paramètres peut varier par rapport à MySQL.


Message édité par MagicBuzz le 16-05-2007 à 19:33:29
n°1561879
kakahn
Posté le 18-05-2007 à 09:17:56  profilanswer
 

han c'est presque cela mais en faite il classe également les NON-adhérents à partir de M. Mais moi je veux que les non adhérents il les classe à partir de la lettre A

n°1561896
MagicBuzz
Posté le 18-05-2007 à 10:31:10  profilanswer
 

(t'es pas relou toi :o)
 

Code :
  1. SELECT nom, adherent
  2. FROM entreprise
  3. ORDER BY adherent DESC, case adherent when 1 then sign(ascii(upper(substring(nom, 1, 1))) - ascii('M') + .1) else 1 end DESC, nom


A tester par contre...
 
En tout cas, ça s'exécute sans erreur. Mais j'ai pas envie de re-créer un jeu de test, et j'ai pas de table sous la main qui me permette de vérifier l'algo :p

n°1561899
MagicBuzz
Posté le 18-05-2007 à 10:34:00  profilanswer
 

A noter que c'est particulièrement lent chez moi sur une table de 2 413 280 lignes (1 minutes et 50 secondes pour s'exécuter complètement).

n°1561900
kakahn
Posté le 18-05-2007 à 10:38:10  profilanswer
 

je vais tester cela je te remercie


Message édité par kakahn le 18-05-2007 à 11:27:00
n°1561902
kakahn
Posté le 18-05-2007 à 10:42:00  profilanswer
 

haaaa merci beaucoup ca marche :)
2 jours que je suis dessus lol !!
 
Tu peux m'expliquer cette partie la de la requete  
 
case adherent when 1 then sign(ascii(upper(substring(nom 1, 1))) - ascii('M') + .1) else 1 end DESC, nom
 
JE connais case when then mais tu peux m'expliquer ton fonctionnement, si cela ne te dérange pas car tu m'as déja bien aider. !!!
Encore merci

n°1561919
MagicBuzz
Posté le 18-05-2007 à 11:15:26  profilanswer
 

Je fais un premier tri en fonction de la valeur d'adherent, puisque c'est le premier point de séparation : les adherent en premier, les autres ensuite.
 
Ensuite, je prends le code ASCII du premier caractère (en majuscule) de mon mot.
Je lui soustrais le code ASCII de M (lettre aléatoire dans ton cas) et j'ajoute 0,1 pour ne pas avoir de possibilité d'avoir un 0 (ça rajouterait un test inutile).
Ainsi, quand c'est négatif, c'est que le mot commence par une lettre inférieure à M, et si c'est positif, c'est que ça commence par une lettre suppérieure ou égale. SIGN() me renvoi donc -1 ou 1, ce qui me permet de trier mes lignes sur le critère de "plus petit ou plus grand que M".
 
Ensuite, il me reste plus qu'à ne faire de tri sur ce champ que lorsque "adherent" vaut 1. C'est ce que fait le "CASE". Lorsque adherant vaut 1, alors je tri par le truc que je viens d'expliquer et dans le cas contraire, je fais un tri sur la constante 1 (donc pas de tri).
 
Il ne reste plus qu'à réordonner mes 3 sous-groupes en fonction de leur nom.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  requete sql: classer par ordre alpha en commencant par une lettre donn

 

Sujets relatifs
[Access-formulaire] Valeur par défaut issue d'une requêteexecuter une simple requete sql avec javascript
Création d'un logiciel pour classer une collectionaffichage requete SQL
Aide requete oracle, sum sur 2 tables différentesTester le nombre de lettre d'une chaine de caractéres
[PostgreSQL et C] Requête rebelle[Résolu][Débutant C#] - Requete SQL
Quelle requête est la plus rapide?Aide creation requete oracle
Plus de sujets relatifs à : requete sql: classer par ordre alpha en commencant par une lettre donn


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR