Requête apparement pas facile...

conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 9 décembre 2013 - 8 avril 2009 à 12:43
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 - 10 avril 2009 à 09:11
Bonjour,

Je tente depuis hier de faire une requête SQL un peu particulière et qui ne semble pas évidente. Alors je vais tenter de vous expliquer ce que j'ai et ce que je dois faire.

J'ai une Table tEvoPop avec les champs suivants (j'en passe quelques-uns) :
- idEvoPop
- strCodeInsee
- pop99
- men99
- pop00
- men00
- pop01
- men01
...
- pop07
- men07

Les champs commençant par pop et men peuvent être null.

J'ai besoin donc pour un (mais c'est pareil pour l'ensemble) strCodeInsee de récupérer dans un des champs commençant par "pop" : la dernière valeur qui n'est pas NULL  ainsi que l'année en question.

exemple pour un enregistrement :
- pop99 : 100
- pop00 : NULL
- pop01 : NULL
- pop02 : 150
- pop03 : NULL
- pop04 : NULL
- pop05 : 210
- pop06 : NULL
- pop07 : NULL

je dois récupérer : Annee : 2005 et sa valeur : 210

pour information cette requête n'est pas finale et fait parti d'un ensemble de requête je ne peux donc par la finir dans une procédure car elle sera lié à d'autre requêtes par strCodeInsee.

Merci de votre aide, car la je bute.

5 réponses

aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
8 avril 2009 à 17:32
Bonjour

à première vue, je dirai que ta base est mal faite, mais je ne suis pas sur que tu y puisse quelque chose, et en plus ca ne résoud pas ton probleme.

je vois bien a partir de la comment récuperer la valeur 210 dans ton exemple :
SELECT COALESCE(pop07, pop06, pop05,...,pop99)
FROM tEvoPop

devrait faire l'affaire, mais pour récuperer le nom du champs, ca va etre plus dur, vue la strucuture de ta base...

cela dis, tu doit pouvoir jouer sur le fait que la concatenation d'une chaine avec un NULL donne un NULL et faire
SELECT COALESCE( 'pop07 : ' + pop07, 'pop06 : ' + pop06, ..., 'pop99 : ' + pop99)
FROM tEvoPop

il doit y avoir une astuce de ce coté la pour contourner ton probléme

a dispo si tu as besoin de plus d'aide (j'ai pas testé la requete, mais je pense qu'avec ca, tu vois le principe)
0
conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 9 décembre 2013
9 avril 2009 à 17:45
Bonjour,

Désolé de repasser si tard, mais j'ai du travailler entre temps sur des corrections de projet et ma hotline, je retourne donc à mon problème (durant une période indéterminé ;-))

En effet pour la base j'ai pas eu trop le choix, il faut que maintenant je fasse avec. J'ai déjà pensé à tout restructurer autrement mais vu le nombre d'applications, les fonctions SQL,Procédure etc, sans parler des requêtes directement dans Visual ou autre qui y font référence, et le temps que j'ai si je doit intervenir sur tout ces changements, ce n'est pas envisageable.

J'étais parti sur la récupération des noms de colonnes et demander via le nom de colonne (dynamique) la valeur jusqu'a en avoir une. mais je suis tombé par la suite sur un os (les Exec dans les fonctions).
puis comme par la suite les colonnes s'ajouterons (2009,2010....) il faut que mon extraction global fonctionne encore dans un an sans avoir à y touché.

Par contre ce que tu m'as suggéré, me permet de voir une autre piste, que je n'avais pas explorer car je ne voyais que la solution du "Case".
Bref voilà il faudrait que j'arrive à mettre un séparateur entre chaque valeur : 100;-1;-1;150;-1;-1;210;-1;-1
et aussi l'année : 1999;2000;2001;2002;2003;2004;2005;2006;2007

ainsi en prenant la Nième valeur vers la droite supérieur à 0, je prends la bonne valeur et dans ce cas il faut que je prenne aussi la Nième (identique) année, l'année et la valeur 99 étant toujours la 1ère.

Ca a l'air simple comme çà, maintenant le tout étant de voir comment le faire en transact.
Je vous tiens au courant.
Merci aieeeuuuuu pour la piste. 
0
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
9 avril 2009 à 18:07
si tu peux passer par une procédure stockée, alors je vois peut etre plus simple

le principe :

un compteur decremental de 2007 a 1999
tu caste le compteur en varchar, et tu récupere les deux derniers caracteres
ensuite, tu fais un select pop[2derniersCaracteres] FROM tEvoPop
si le resultat est non null, tu renvoi le resultat, ansi que le compteur, et tu sort de ta boucle

je trouve ca assez lourd, mais l'avantage, c'est que tu peux facilement l'adapter pour que ca ne parte non pas de 2007, mais de l'année en cours (avec un YEAR(GETDATE())), et tu ne devrais plus avoir a toucher a cette procédure(ou fonction)
0
conan76 Messages postés 32 Date d'inscription lundi 28 juillet 2003 Statut Membre Dernière intervention 9 décembre 2013
10 avril 2009 à 08:56
C'est là le problème je ne peut pas passer par une procédure stockée,  la rigueur une fonction. Au final l'ensemble de mon extraction (ici la requête sur la population ne fait que 5% de la requête) tiendra dans une vue, j'irais simplement tout les ans lancer l'éxecution de la vue (après avoir mis à jour toutes mes tables avec les nouvelles données bien sûr) et recopier le résultat (copier/coller) dans excel en y ajoutant mes entêtes.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
aieeeuuuuu Messages postés 698 Date d'inscription jeudi 16 janvier 2003 Statut Membre Dernière intervention 20 mai 2011 3
10 avril 2009 à 09:11
bah si tu peux passer par une fonction, le pprincipe est le meme, et je pense que ca sera plus simple, à développer en tout cas.

après a toi de voir en fonction du contexte la solution la meilleur
0
Rejoignez-nous