|
Publicité ' | ||||||||||||||||||||||||
|
|
#1 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Bonjour à tous,
Je débute en SQL et je suis amené à en faire de manière très occasionnelle. Aujourd'hui je doit réaliser une requete permettant de faire un cumul progressif. Voici MOIS OUVERTS CLOS STOCK -------------------------------------------------------- 1 10 8 2 2 5 6 1 3 3 9 -5 etc. |
|
|
00
|
|
|
#2 |
![]() ![]() ![]() Nicolas SouquetAdministrateur de base de données Inscription : janvier 2005 Messages : 4 670 ![]() |
Bonjour,
Tout simplement : @++
__________________
En bases de données relationnelles SQL, il n'y a ni tableaux, ni enregistrements, ni champs: il y a des tables, des lignes et des colonnes. Blog | Profil| Consulter ou télécharger les fichiers d'aide de SQL Server, des versions 2000 à 2012 |
|
00
|
|
|
#3 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
J'aurai bien voulu que la solution soit si simple mais ma colonne STOCK doit être calculée à partir des colonnes OUVERTS et CLOS
|
|
|
00
|
|
|
#4 |
|
Invité de passage
![]() chef de projet produit Inscription : décembre 2011 Messages : 2 ![]() |
l'utilisation d'une fonction n'est pas forçément appropriée .
quelle est la regle de calcul du stock ? sur la 1ere ligne , on pense stock = ouvert - clos sur la deuxieme , c'est le contraire :stock = clos - ouvert sur la troisime, rien ne marche... |
|
|
00
|
|
|
#5 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
la regle de calcul du stock est la suivante
sur la 1ere ligne , stock = ouvert - clos sur la deuxieme , stock = ouvert - clos + (stock 1ère ligne) sur la troisime, stock = ouvert - clos + (stock 2ème ligne) |
|
|
00
|
|
|
#6 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Code :
SELECT sum(ouvert-clos) FROM dbo.matable |
|
|
00
|
|
|
#7 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Le SUM me renvoie un message d'erreur :
"Impossible d'exécuter une fonction d'agrégation sur une expression comportant un agrégat ou une sous-requête." Car les ouverts et clos sont obtenus à partir de COUNT |
|
|
00
|
|
|
#8 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Ah... Ca change pas mal de choses...
Il serait p-e utile de poster la structure de votre table. |
|
|
00
|
|
|
#9 | ||||||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Voici la requête me permettant d'obtenir le delta mois par mois :
Code :
Code :
Code :
|
||||||
|
|
00
|
|
|
#10 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Ok et donc si j'ai bien compris, il vous faut maintenant la somme des stocks de chaque mois.
Ce n'est surement pas la méthode la plus propre/performante (je laisse le soin à elsuket et sqlpro (ou autres, je ne voudrais vexer personne^^) de vous la donner/proposer ^^) mais si vous êtes dans l'urgence du résultat, une manière rapide de l'obtenir est de travailler avec une CTE (Common Table Expression). Code :
|
||
|
|
00
|
|
|
#11 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
|
|
|
00
|
|
|
#12 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Voilà, j'ai planché un peu sur ce problème (j'aime bien les énigmes^^) et je suis arrivé à ceci :
Code :
Donc, si je ne suis pas dans l'erreur, vous pouvez utiliser une CTE à la place de ma table temporaire comme dans mon exemple précédent. Vous n'avez plus qu'à faire la requête indiquée en grand en remplaçant #tmp par le nom de votre CTE. |
||
|
|
00
|
|
|
#13 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Je viens d'essayer la requete, en revanche elle tombe en timeout si je la lance à partir du concepteur de requete.
(Pour info, je travaille sous SSRS) |
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Etrange ce timeout...
Votre requête de base (celle qui fourni le delta par mois) s'exécute sans problème ? Dans quel délai ? Donnez également le code exact de la requête qui vous donne le timeout (on ne sait jamais^^) |
|
|
00
|
|
|
#15 |
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
La requete de base est assez rapide (env 2sec.)
Je lance la requete dans le gestionnaire de rapport SSRS (en Web), je mesure le temps de réponse. Résultat : 1min40s Mais les résultats sont là !! Merci bcp |
|
|
00
|
|
|
#16 | ||
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Si votre requête qui fournit le delta ne prend que 2 secondes, l'ensemble ne devrait pas fournir de timeout.
Que faites-vous exactement ? Edit : Pour être complet, vous devriez avoir quelque chose dans ce goût là. Code :
|
||
|
|
00
|
|
|
#17 | ||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Vu que mon graphe SSRS doit renvoyer également les OUVERTS et les CLOS j'ai fait un UNION, voici la requête :
Code :
|
||
|
|
00
|
|
|
#18 | ||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
J'ai solutionné mon pb de la manière suivante :
Code :
|
||
|
|
00
|
|
|
#19 |
|
Membre Expert
![]() Analyste / Programmeur Inscription : juillet 2006 Messages : 1 307 ![]() |
Pourquoi ne pas simplement ajouter ouvert et clos dans la CTE nommée T1 ?
Cela simplifierait grandement votre requête je pense. |
|
|
00
|
|
|
#20 | ||
|
Invité de passage
![]() Inscription : décembre 2011 Messages : 13 ![]() |
Quelque chose dans ce goût là ?
Code :
|
||
|
|
00
|
Copyright © 2000-2012 - www.developpez.com