|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||
![]() ![]() ![]() Inscription : février 2005 Messages : 2 798 ![]() |
Bonjour,
J'ai un petit problème de réflexion autour d'une requête. J'ai une table contenant l'historique des crédits achetés et dépensés par un utilisateur.
On a donc quelques choses comme : Code :
Merci PS : Vous pouvez me répondre en SQL ou en francais
__________________
Besoin d'un site internet ? Contactez Wixiweb Suivez Moi sur GOOGLE+ Mes articles - Chargée d'étude, aménagement et développement du territoire - Camp de basket - Passion Sans Frontiere - |
||
|
|
00
|
|
|
#2 |
|
Membre Expert
![]() Responsable de service informatique Inscription : janvier 2009 Messages : 1 081 ![]() |
Bonjour,
Je dirai que tu as un soucis pour calculer le crédit actuel, car tu ne sais pas si les achats ont été utilisés avant leur fin de validité, donc tu n'as aucun moyen de savoir s'il faut les inclure ou pas dans le calcul. Tatayo. |
|
|
00
|
|
|
#3 |
![]() ![]() ![]() Inscription : février 2005 Messages : 2 798 ![]() |
En fait, j'ai d'autres colonnes que je n'avais pas indiqué.
Je viens d'éditer mon poste précédant
__________________
Besoin d'un site internet ? Contactez Wixiweb Suivez Moi sur GOOGLE+ Mes articles - Chargée d'étude, aménagement et développement du territoire - Camp de basket - Passion Sans Frontiere - |
|
|
00
|
|
|
#4 |
|
Membre confirmé
![]() Simon C.Développeur Web Inscription : avril 2010 Messages : 127 ![]() |
En fait au bout de 6mois si le type n'a pas utilisé son crédit, il est remis à zero c'est bien ca?
|
|
|
00
|
|
|
#5 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bonjour
Code sql :
sous SQL Server 2008 J'explique : 1/ Les 3 CTE : La première sert à générer le jeu de données. J'ai ajouté une ligne à votre jeu de données, afin d'avoir un debit après l'expiration du premier credit Les deux autres CTE servent à isoler les debit des crédits. j'ai également modifié le montant d'un débit, mis à 10 et changé sa date pour faire ressortir un autre cas particulier : un débit "à cheval" sur deux crédits... Bien sur, on peut les remplacer par des pseudo tables dans la requete, voire faire une auto-jointure en modifiant les filtres et ainsi eviter des sous requetes. Mais je pense que c'est plus clair comme ça pour commencer. 2/ La sous requete Pour chaque crédit, je soustrait les débits qui ont eu lieu entre la date d'expiration du crédit, et la date d'expiration du crédit précédent. (la aussi, on pourrait faire mieux, avec une jointure supplémentaire, mais c'est pour rester le plus simple possible sur l'algo...) 3/enfin, je fais la somme des crédits qui n'ont pas encore expiré à la date voulue (j'ai mis arbitrairement le '2001-10-01' dans mon exemple, mais si vous voulez le crédit actuel, comparez à la date courante), ou les crédit dont le solde est négatif (heu... vous autorisez les découverts ? :d) Blague à part, ce dernier point est important, car il permet de prendre en compte les points débités "à tort" par la sous requête sur des crédits "épuisés", lorsqu'un nouveau crédit à eu lieu avant la date d'expiration du débit précédent... (mon crédit "à cheval" de tout à l'heure...) J’espère n'avoir pas "oublié" d'autres cas particuliers, et je vous conseille de tester sur un jeu de données plus important, mais je crois que c'est deja un bon debut... |
||
|
|
10
|
|
|
#6 |
![]() ![]() ![]() Inscription : février 2005 Messages : 2 798 ![]() |
Salut,
J'essai de transposer ça à du Mysql mais je ne suis pas sur de retrouver la syntaxe WITH table AS. Je regarde ça. En tout cas, un grand merci pour cette nouvelle piste !
__________________
Besoin d'un site internet ? Contactez Wixiweb Suivez Moi sur GOOGLE+ Mes articles - Chargée d'étude, aménagement et développement du territoire - Camp de basket - Passion Sans Frontiere - |
|
|
00
|
|
|
#7 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
La même requête, sans les CTE (WITH...AS)
En un peu moins lisible donc... Code sql :
dis nous déjà si ça fonctionne comme tu veux, on pourra optimiser après |
||
|
|
10
|
|
|
#8 | ||
![]() ![]() ![]() Inscription : février 2005 Messages : 2 798 ![]() |
Salut,
J'ai essayé d'adapté avec mes vrais noms de colonnes et j'ai également ajouté un condition sur l'utilisateur. J'ai également mis NOW() pour avoir la date du jour. Par contre, le résultat ne va pas. Je devrais avoir un crédit de +47 et je me retrouve avec -1 Code :
__________________
Besoin d'un site internet ? Contactez Wixiweb Suivez Moi sur GOOGLE+ Mes articles - Chargée d'étude, aménagement et développement du territoire - Camp de basket - Passion Sans Frontiere - |
||
|
|
00
|
|
|
#9 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
a première vue, j'ai l'impression que tu as inversé les clauses de filtrage sur les pseudos tables
pour les crédits, tu cherche Alors que ça devrait être l'inverse... |
|
|
00
|
|
|
#10 | ||||
![]() ![]() ![]() Inscription : février 2005 Messages : 2 798 ![]() |
Bien vu. Voici mon nouveau code :
Code :
Code :
__________________
Besoin d'un site internet ? Contactez Wixiweb Suivez Moi sur GOOGLE+ Mes articles - Chargée d'étude, aménagement et développement du territoire - Camp de basket - Passion Sans Frontiere - |
||||
|
|
00
|
|
|
#11 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Bon
première remarque, il y a une petite erreur dans la recherche des bornes pour l'attribution des credit a un debit donné. 1/ Dans ma requete d'origine, (je cherche les credits dont la date se situe entre l'expiration du credit, et la date d'expiration du credit précédent), je fais un COALESCE pour le cas du premier credit (qui n'a donc pas de credit précédent 2/ cependant, même en corrigeant cette erreur, la requete renvoie toujours 60 avec ton jeu de données. Par contre j'ai vérifié avec ma requete initiale, elle me renvoi bien 43... Il y a donc eu une erreur dans la traduction... Je cherche d'ou ca peut venir |
|
|
00
|
|
|
#12 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
reBon !
Deuxième remarque, vous utilisez toujours dateExpiration dans votre requete, parfois à la place de dateEvenement... Mais on arrive toujours sur 60 ![]() Au passage, ma deuxième requête (sans les CTE) donne également 43... pourtant elles sont presque identiques maintenant... |
|
|
00
|
|
|
#13 | ||
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
ceci doit etre mieux...
Code sql :
|
||
|
|
00
|
|
|
#14 |
|
Membre Expert
![]() ![]() Inscription : janvier 2010 Messages : 1 084 ![]() |
Attention toutefois si deux crédits ont lieu à la même date, un seul sera pris en compte.
Vu que vous prenez les secondes en comptes, cela ne devrait pas arriver, mais vous devriez ajouter une contrainte pour vous en assurer... |
|
|
00
|
Copyright © 2000-2012 - www.developpez.com