conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDernière intervention 9 décembre 2013
-
8 avril 2009 à 12:43
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 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.
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.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 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)
conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDerniè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.
aieeeuuuuu
Messages postés698Date d'inscriptionjeudi 16 janvier 2003StatutMembreDernière intervention20 mai 20113 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)
conan76
Messages postés32Date d'inscriptionlundi 28 juillet 2003StatutMembreDerniè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.
Vous n’avez pas trouvé la réponse que vous recherchez ?