|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Est-il possible d'utiliser directement un résultat que l'on vient de calculer pour une autre expression ?
Voici un exemple plus explicite de ma question : Code :
au lieu de Code :
Le but serait d'utiliser une fonction raccourci qui permettrait d'éviter de réecrire l'expression entière. Merci pour votre aide. |
||||
|
|
00
|
|
|
#2 | ||
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 770 ![]() |
Directement dans le select, non? Mais vous pouvez utiliser une CTE (à partir de SQL 2005) pour pré-calculer votre premier résultat.
Code :
|
||
|
|
00
|
|
|
#3 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
bonjour
"directement", non. par contre vous pouvez faire ceci : Code sql :
Mais je ne vois pas l'intérêt |
||
|
|
00
|
|
|
#4 |
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Bonsoir,
n'y a t'il aucun moyen de faire ceci sans modifier la clause FROM ? Car dans ma query initiale, j'ai déjà plusieurs join qui s'y affère. Dès lors, je commence à m'emmeler. L'intêret est d'allléger/améliorer la visibilité de ma query. Je vous ai donné ici un exemple simple, mais ma query est bien plus complexe. |
|
|
00
|
|
|
#5 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Puisque vous semblez être en 2005, et si votre but est d'améliorer la lisibilité de votre requete, alors la solution de Jinroh77 est surement ce qu'il vous faut !
En gros dans votre cas cela revient a définir avant la requete elle même des résultats intermédiaires. Vous vous y retrouverez donc facilement dans la requete par la suite. En fonction de vos besoins, une vue pourrait aussi être une solution adaptée Enfin, mais cela n'engage que moi, dans votre question initiale, je trouve que votre deuxième requete, bien indentée, est bien plus lisible que la première ! En effet, on voit très vite que la deuxième ligne du SELECT reprend la première... Effectivement, si votre requete est vraiment très compliquée, avec de nombreux calculs imbriqués, alors passez soit par une CTE, soit par une vue(qui en plus pourra peut être être indexée par la suite pour améliorer les performances de votre requete) |
|
|
00
|
|
|
#6 | ||
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Merci pour vos suggestions.
Dès lors, pourrai-je vous demander comment vous simplifieriez ce code ci-dessous svp ?! Code :
|
||
|
|
00
|
|
|
#7 |
![]() ![]() Alexandre ChemlaConsultant en Business Intelligence Inscription : février 2006 Messages : 1 770 ![]() |
La valeur de C2 utilise dans son CASE WHEN la valeur de C1 ?
|
|
|
00
|
|
|
#8 |
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
|
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Tu peux aussi utiliser les UDF...
La ta requete pourra vraiment être plus lisible surtout si tu met de la logique métier, ca peut être aussi une bonne solution Mais tu a besoin des résultats intermédiaires au final, ou c'est juste pour vérifier que ta requete fonctionne bien, et donc avoir les différentes étapes pour debugguer ? |
|
|
00
|
|
|
#10 | |
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Citation:
Je suis novice, mais je souhaite en apprendre tous les jours. UDF ? je vais checker ca, mais pour info.. je DOIS avoir tout mon code dans une seule et même reqûete. Merci d'avance |
|
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
|
|
|
00
|
|
|
#12 | |||
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Citation:
Sinon, pour en revenir à mon exemple, je peux l'expliquer d'une autre manière. Je souhaiterai savoir comment faire ceci : Code :
|
|||
|
|
00
|
|
|
#13 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
les fonctions en question n'ecriraient pas dans la base de données, et ne lirait pas non plus d'ailleurs. Elles pourraient simplement prendre en parametre les données que tu traitera dans ton SELECT, et effectuer le calcul dessus.(tu pourrait juste encapsuler tes case dans ces fonctions)
Par contre effectivement il te faudra les privilèges de création pour les fonctions... puis les privilèges pour les exécuter... |
|
|
00
|
|
|
#14 |
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Vois-tu alors une solution à mon problème ?!
|
|
|
00
|
|
|
#15 | |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Citation:
J'en vois plusieurs : 1/ demander au DBA de faire son travail. 2/ demander au DBA de te donner les privilèges nécessaires pour que tu puisse faire son travail 3/ revenir a la solution des CTE, voire ta solution initiale, car après tout il ne s'agit ici que d'un problème de lisibilité! comme je le disais plus haut, une requete bien indentée peu rester lisible même avec plusieurs imbrications de CASE... |
|
|
|
00
|
|
|
#16 | ||
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
je vais donc devoir opter pour l'option numéro 3 : CTE.
Par contre, pourrais-je abuser de vos aides pour me réécrire ces lignes de code, mais avec l'utilisation d'un WITH ?! Etant novice, je vais prendre beaucoup de temps pour le faire (mais j'essaye quand même dès la fin de mon message).Je vous en serais reconnaissant. Code :
|
||
|
|
00
|
|
|
#17 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Si condition1 correspond a col1 = UnGrosCalcul(col2, col3)
Alors, tu dois fauire quelque chose du genre Code sql :
Tu pourrai aussi ajouter les autres calculs de la même façon (condition2, condition3, et condition4), mais tu risque de faire pas mal de calculs inutiles (si condition1 est vrai tout le temps, les calculs pour condition2, condition3 et condition4 ne seront jamais effectués, et condition5 ne sera même jamais évaluée), donc tu risque de perdre pas mal en performance. Dans ce cas, il faudra faire une deuxième CTE, avec une jointure sur la première et une clause WHERE du type WHERE NOT col1 = intermediare.UnGrosResultat et ainsi de suite |
||
|
|
00
|
|
|
#18 | ||
|
Futur Membre du Club
![]() Inscription : décembre 2010 Messages : 125 ![]() |
Merci beaucoup. Je vais essayer de chipoter et d'arriver à mon résultat avec ceci.
Sinon, parrallèlement, je n'arrive pas à joindre correctement ceci. J'aimerai avoir la somme de chacun des WITH. Code :
|
||
|
|
00
|
|
|
#19 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
comme ceci :
Code sql :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com