begin process at 2012 05 27 05:36:02
  Trouver un code source :
 
dans
 
Accueil > Forum > 

SQL

 > 

Autre

 > 

Requêtes

 > 

sélection différente suivant contenu d'un champ


Derniers messages déposésPoser une question dans le forum ou lancer une discussion

sélection différente suivant contenu d'un champ

samedi 3 décembre 2011 à 23:00:51 | sélection différente suivant contenu d'un champ

casy

Membre Club

Salut à tous.
(Le titre est un peu bidon, je ne sais pas trop résumer mon problème)

J'ai une requete particulière à faire, et je manque d'inspiration.

Le contexte :
J'ai une table produit avec diverses informations et dont le code (clé primaire) est codé de la sorte : référence ou référence-indice (ex: ABC, CDF, GHF-A, GHF-B, MLK, OIU-D,OIU-H, ....). L'indice, quand il existe est généralement 1 lettre, parfois 2.

La requête :
Je dois récupérer une liste pour charger le datasource d'une grille, liste comportant toutes les références sans indice ainsi que, pour les références avec indice, seulement la référence avec l'indice le plus élevé.


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
dimanche 4 décembre 2011 à 13:10:28 | Re : sélection différente suivant contenu d'un champ

cgandco

Bonjour,

Deux petites questions :

1) Quel est le type de ton champ ?

2) La reference comporte toujours 3 caractères ?

Bonne journée




Faites simple, aussi simple que possible, mais pas simpliste.
A. Einstein.
dimanche 4 décembre 2011 à 13:42:55 | Re : sélection différente suivant contenu d'un champ

casy

Membre Club
Le champ est de type chaine de caractère, équivalent varchar sous sqlserver, longueur maxi 19 caractères.

Non les références sont de longueur variable (3 caractères c'est le hasard des exemples donnés). Pour celles qui ont un indice, celui-ci est toujours séparé de la réfécence par le caractère - et de longueur variable (normalement 1 caractère, mais j'ai quelques références mal codifiées avec un indice sur 2 caractères, mais il n'est pas impossible que d'autres mauvaises codifications à l'avenir, entrainent des indices sur plus de caractères)

---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
dimanche 4 décembre 2011 à 19:43:50 | Re : sélection différente suivant contenu d'un champ

pradiergael

Bonjour,

Je m'interroge sur le bienfondé de conserver deux informations dans un seul champ. Ceci ne respecte pas la première forme normale !!
Il serait peut-être souhiatable de créer une colonne indice, colonne nullable.

Cela étant dit, je vous propose de faire ceci:

Code :
select ... from Table where code not like '%-%'
union
select ... from Table T where exists 
( select 1 
  where T.code = select code 
                 from 
                 ( select max(code) as code ,code_seul 
                   from 
                   (
                     select code,
                       substring(code,1,charindex(code,'-')-1) as code_seul 
                    from Table where code like '%-%'
                   ) tmp
                   group by code_seul
                 )
)


en terme de performances, ajouter une colonne index vous permettrait qd même d'optimiser largement ce genre de requete



en terme
dimanche 4 décembre 2011 à 20:51:18 | Re : sélection différente suivant contenu d'un champ

casy

Membre Club
Je ne maitrise pas la structure de la table (y compris les index) puisque elle appartient à un logiciel commercial. Mais la colonne en question étant la clé primaire, j'ose espérer que l'index y est bien créé dessus.

Quant à la notion de référence/indice, c'est une notion de codification propre à l'organisation de l'entreprise. Pour le logiciel, cette colonne est une référence article unique, indépendamment de sa codification.

La performance est ce qui va poser le plus de problème. Je suis obligé de passer par un driver ODBC propriétaire pour attaquer la base, driver qui est d'une lenteur extrême. J’essaierais, normalement demain, cette requete, mais vu sa constitution, je m'attend déjà, pour environ 9 à 10 000 lignes retournées à une exécution de plusieurs minutes.

Une des solutions serait de passer sur une base SQL, mais, là, le problème est le coût prohibitif (pour une entreprise extrêmement radine) des licences à changer.


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
dimanche 4 décembre 2011 à 22:23:09 | Re : sélection différente suivant contenu d'un champ

pradiergael

Réponse acceptée !
solution commerciale ... j'espère que c'est pas cher !

concernant ma proposition précédente, il manque une vérif d'égalité sur code_seul et substring(T.code,1,charindex(T.code,'-'))

concernant la requête, s'il s'agit de SQL 2005 ou 2008, il devrait être interessant d'utiliser les CTE :

Code :
with TMP as
(
  select max(code) as code,code_seul 
  from ( select code, substring(code,1,charindex(code,'-')-1) as code_seul 
         from Table where code like '%-%') t1
  group by code_seul
)
select xxx,yyy from Table where code not like '%-%'
union
select T.xxx,yyy from Table T inner join TMP on T.code = TMP.code


ca parait plus simple comme ceci, et plus rapide


dimanche 4 décembre 2011 à 22:47:55 | Re : sélection différente suivant contenu d'un champ

casy

Membre Club
Solution commerciale quand même pas donnée (SAGE100)
Ce n'est pas vraiment le logiciel qui est en cause, mais l'utilisation qui en est faite. Et encore, tout ça est très récent (2 mois), les données viennent, elles, d'une appli interne qui a plus de 15 ans et dont le but est d'en abandonner une partie seulement, pour la remplacer par SAGE100.

D’où la contrainte, on supprime une partie, donc à adapter au nouveau logiciel, mais on ne peut rien casser car il faut garder la compatibilité avec ce qui reste et donc tous les historiques, etc ...
Donc pour résumer, on change le logiciel mais on garde toutes les merdes faites depuis 15ans, et en plus, on est obliger de faire des contorsions pour que tout ce la marche à peu près.

Pour SQL, c'est du 2000, sur un WS2003-32 avec 4Go de ram, qui est aussi contrôleur AD, serveur Exchange, contrôleur AV (sophos), serveur de fichier, contrôleur de backup, serveur web pour 3 sites dont l'intranet, serveur FTP, et j'en oublie surement.
Le pauvre serveur, il est sur les genoux. Mais à part dire que ça rame, ça n’inquiète pas grand monde


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
lundi 5 décembre 2011 à 17:11:36 | Re : sélection différente suivant contenu d'un champ

casy

Membre Club

Bon les requetes ne marchent pas.

Le "Select 1 Where" est vu comme une erreur de syntaxe, le "With TMP .." n'est pas reconnu non plus.

Ce driver ODBC est vraiment une merde.


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #
lundi 5 décembre 2011 à 22:03:44 | Re : sélection différente suivant contenu d'un champ

pradiergael

Réponse acceptée !
Bonjour,

se trainer les boulettes vieilles de 15 ans pour assurer la compatibilité, je connais !!

sonon, odbc n'est pas en cause, c'est la version (SQL 2000) : elle ne sait pas utiliser les CTE (with ...)

essayons ceci :

Code :
select xxx,yyy from Table where code not like '%-%'
union
select T.xxx,T.yyy from Table T 
inner join 
( select max(code) as code,code_seul 
  from ( select code, substring(code,1,charindex(code,'-')-1) as code_seul 
         from Table where code like '%-%') t1
  group by code_seul
) as TMP on T.code = TMP.code


En espèrant que ce soit plus probant.
lundi 5 décembre 2011 à 22:22:08 | Re : sélection différente suivant contenu d'un champ

casy

Membre Club
Heuu, pour le coup, j'ai fait les tests en direct sur l'odbc, sans passer par SQL2000, donc ça ne vient pas de SQL2000.
Mais le driver odbc de Sage n'est pas mieux, et même pire. Il n'accepte pas tout, ne connais pas par exemple la requete paramétrée, ...

Si tu ne le connais je te conseille vivement ..... de n'avoir jamais à le connaitre.

J’essairai ça demain, mais je pense déjà que le "inner join ( select" risque de pas passer.

Sinon, je vais pas batailler des heures non plus. J'expliquerais que ce n'est pas possible et que s'ils veulent que ce soit possible, il faudra sortir de chéquier pour passer à la version full-SQL


---- Sevyc64 (alias Casy) ----

# LE PARTAGE EST NOTRE FORCE #

1 2

Cette discussion est classée dans : référence, sélection, contenu, indice, différente


Répondre à ce message

Sujets en rapport avec ce message

requete croisement de table [ par sdisp ] Bonjour, je souhaiterais pouvoir croiser des ligne dans mon tableau, je expliques, j'ai une table de se genre: id id_suivant référence 1 3 10 2 1 1 je ne peu plus afficher le contenu d'une table [ par abdoo05 ] salut, j'ai crée un pg avec java qui permet d'afficher le contenu d'une table de base de donnée... mais le pb est que ma table est trop chargé et je n Générer un indice [ par atmeitsatme ] Bonjour,J'ais une table qui possède un champ indice qui est une clé primaire.Cette clé est juste une donnée qui permet de ne pas avoir de doublons.Je Faire une boucle de INSERT INTO [ par IdrilElendil ] Bonjour, j'essaie de faire une boucle pour insérer plusieurs lignes de suite dans une table d'Access via une procédure en VBA. For Indice = 1 To 3   copier le contenu d'une table dans une autre [ par biloutte33 ] bonjour,j'aimerais savoir quel requete faut-il que j'execute pour copier le contenu d'une table (le contenu pas les champs!) à une autre?genre par exe Clause Where différente [ par babe59 ] Bonjour,Je fais une procédure stockée sous SQL Server pour retourner une liste de records. J'aimerai passer un paramétre (@param) à cette proc pour re contenu de la table sql [ par beny100 ] bonjour,j'ai un problème pendant mon export en excel même quanr le contenu de la table d'ou la requette s'effectue est vide elle me renvoie une page e Sélection les N premiers mots d'un champ texte [ par keskispas ] Bonjour tout le monde !Je cherche quelque chose de super simple : Retourner les N premiers mots d'un champ de texte.Dans ce cas, le séparateur serait choix champs Texte ou Memo / optimisation [ par yan35 ] Bonsoir,Je voudrais optimiser 1 base Access qui commence à ramer avec 40000 enregistrements d'une longueur de plus de 400 octets, dans 1 table.J'ai un Langue base de données différente que celle du serveur [ par bossun ] Salut,J'ai un serveur SQL 2005 en Anglais (us_English)J'ai besoin qu'au moins une de mes base soit localisé en fr_Switzerlandà quel niveau dois-je def


Nos sponsors


Sondage...

CalendriCode

Mai 2012
LMMJVSD
 123456
78910111213
14151617181920
21222324252627
28293031   

Consulter la suite du CalendriCode

A découvrir



 
Développement réalisé par Nicolas SOREL (Nix) avec l'aide de : Cyril DURAND et Emmanuel (EBArtSoft), Merci à Vincent pour ses précieux conseils.
CodeS-SourceS.com© Toute reproduction même partielle est interdite sauf accord écrit du Webmaster
CodeS-SourceS.com© est une marque déposée tous droits réservés

Google Coop CodeS-SourceS Google Coop CodeS-SourceS
Temps d'éxécution de la page : 4,696 sec (3)

Nous contacter | Annoncer sur CodeS-SourceS | Mentions légales