Requête trop balaise à faire... [asp][sql] - Programmation
Marsh Posté le 28-05-2001 à 12:41:44
sacre mam, tjs aussi movai...
select sum(eprdhyd_e) from table where (annee='2001' and mois between '01' and '02') OR (annee='2000' and mois between '03' and '12')"
Comment veux tu qu'un truc soit et en 2000 et en 2001
Marsh Posté le 28-05-2001 à 12:48:33
Oui, mais cai pas assez pratique comme requête.
Pour que ça marche à chaque fois sur une période de 12 mois :
Code :
|
Comme ça, tu prends n'importe quelle période, ça marchera à tous les coups.
Marsh Posté le 28-05-2001 à 13:11:38
Trictrac -> Ta soeur pov'con (nan, je préfère celle du Lux )...
Je suis pô bon en sgbd, j'y peux rien... et pis un OR à la place d'un AND, c pô la mort...
Merci Fred pour ta requête, mais y va me falloir 2 heures pour comprendre...
Marsh Posté le 28-05-2001 à 13:27:55
Heu, Fred... C censé donner ki avec les valeurs...
select sum(eprdhyd_e)
from
table
where
annee * 100 + mois between (2000 * 100 + 03) and (2001 * 100 + 02)
Ben, gauffrage...
Marsh Posté le 28-05-2001 à 13:32:21
Alors voilà :
Tu veux effectuer une requête portant sur une période de type :
mois/année début -> mois/année fin.
Pour ce genre de trucs, il y a un format de date qui convient très bien : AAAAMM.
Par exemple, si tu veux aller de mai 2000 (05/2000) à mars 2001 (03/2001), tu iras alors de 200005 à 200103.
Vu la structure de ta table, avec un champ année et un champ mois, tu passes au format AAAAMM avec l'opération suivante :
année * 100 + mois.
ex pour mai 2000 : 2000 * 100 + 5 = 200000 + 5 = 200005
L'intérêt de ce format est qu'il permet d'effectuer des comparaisons de dates en les considérant comme des NOMBRES.
Et, évidemment, tu peux étendre ça au format AAAAMMJJHHMMSS
PS : un OR à la place d'un AND CAI LA MORT
Marsh Posté le 28-05-2001 à 13:39:57
cool j'allais justement te poser la question fred pour la multiplication par 100.
Marsh Posté le 28-05-2001 à 13:40:45
Mouais... mais y'a un hic !
si je fais un "select toto from table where annee = annee *100"...
On s'arrête là, c'est suffisant pour la démo.
Avec annee = 2001, on a:
"select toto from table where annee = 200100"...
Jusque là, j'ai compris.
Or, dans ma table, j'ai un champ 'annee' et un champ 'date'...
Donc le serveur va regarder dans ma table si y'a un 'annee = 200100'... or étant donné ke je n'ai ke que 2001 dans mon champ 'annee', y va gauffré et me dire ki trouve pô de résultat (logique, nan )
Et comme ma table a 102 lignes, g pô envie de reprendre tout ça... mais g compris ta technique et c vrai ke c pô tétard tout ça...
Marsh Posté le 28-05-2001 à 13:47:18
mais t'es c** mam.... il te demande pas de changer les donees dans la table.. puisque tu sais qu'il fo multiplier par 100..
tu cherche donc pas annee = 200100, mais annee*100 = 200100..
et puis ceci implique d'avoir le mois = 0.. puisque la manip n'a d'utilité que si tu veux tenir compte des mois aussi..
Marsh Posté le 28-05-2001 à 13:52:02
boh, j'abandonne.....................
ARRGGGHHHH, JE CRAQUE !!!!!
Marsh Posté le 28-05-2001 à 13:54:48
(avec un champ date le principe est strictement le même)
(pour les détails, j'arrive, je bouffe)
Marsh Posté le 28-05-2001 à 13:58:44
hihhi.. salut Fred999 !!!!!
T'en a fais craquer un ..
Bref, ta technique est cool...
La multiplication par 100 c pour tenir compte des mois pour ceux ki l'aurait pas vu .. D je fais celui ki a l'air d'avoir compris ...
Com trictrac l'a dit... c bien si tu veux prendre en compte plus qu'un seul champ de la date.. genre annee et mois..
ou encore mois et jour... etc.
Marsh Posté le 28-05-2001 à 14:00:21
heu, m'a trompé, g annee et mois
avec annee mois champ1 champ2 ...
2001 02 v1_1 v2_1
2001 01 v1_2 v2_2
2000 12 v1_3 v2_3
2000 11 v1_4 v2_4
2000 10 v1_5 v2_5
etc...
Marsh Posté le 28-05-2001 à 14:47:59
mammam a écrit a écrit : Heu, Fred... C censé donner ki avec les valeurs... select sum(eprdhyd_e) from table where annee * 100 + mois between (2000 * 100 + 03) and (2001 * 100 + 02) Ben, gauffrage... |
C'est quoi le message d'erreur?
Bizarre, j'ai déjà employé cette méthode.
Marsh Posté le 28-05-2001 à 14:59:45
a mon avis... annee c pas un nombre mais un varchar ou un truc dans le genre..
Marsh Posté le 28-05-2001 à 16:55:27
Je conseillerais alors dans ce cas d'ajouter une colonne FLAG_CUMUL_FIXE qui prend la valeur 1 quand les mois sont à prendre en compte dans le cumul fixe, et la valeur 0 par défaut.
Cela permettra rapidement de sélectionner les mois corrects (avec une moulinette toute con, ça permettra en plus de mettre à jour ultérieurement en 2 temps 3 mouvements)
Sinon un truc du genre :
Select annee,mois,sum(eprdhyd_e) from table
group by annee,mois
where FLAG_CUMUL_FIXE = 1;
pourrait marcher, non ? (sans utiliser de flag, il suffit de changer le where)
[edit]--Message édité par irulan--[/edit]
Marsh Posté le 29-05-2001 à 08:35:42
Merci de votre aide... Mais j'ai fait la requête 1° version... avec le fameux 'OR'... Ca marche bien, et c'est l'essentiel !
Le pb, c'est kil fô pô ke je commence à rajouter flag un peu tout partout partout c'es^t pô moi ki fera la mise à jour... Eh oui, je suis en stage...
Marsh Posté le 29-05-2001 à 09:39:54
Mais justement la colonne flag est beaucoup plus facile à maintenir avec un petit script à lancer une fois par mois, qui s'occupera de mettre à jour les valeurs correctement, plutôt qu'aller chaque fois modifier en dur le script que tu fais !
Le script de MAJ du flag devra bien sûr faire intervenir sysdate (qui donne la date du jour), afin de n'avoir qu'a faire un copier-coller quand on veut mettre à jour.
Enfin bon moi je dis ça...
[edit]--Message édité par irulan--[/edit]
Marsh Posté le 29-05-2001 à 10:45:46
Ben, pour l'instant, le script du site est tel que l'utilisateur n'a qu'à remplir la table et ça fait tout tout seul... C'était le but du stage : faciliter la maintenance (enfin, kan qqun vous dit faciliter la maintenance, ça veut dire ke moins il en aura à faire plus y sera content)... Donc mission accomplie...
Marsh Posté le 29-05-2001 à 11:07:02
Disons que le fait de changer les dates en dur dans le script n'est pas vraiment ce qu'il y a de plus pratique...
La soluce d'Irulan est aussi pratique.
Marsh Posté le 29-05-2001 à 13:35:30
Ah ben nan... je ne change pô les dates en dur dans le script... En fait, je récupère le mois et l'année d'une liste (remplie avec une table) que l'utilisateur sélectionne et je change les valeurs sur ma page suivant la date avec une requête qui figure dans une table 'choix'...
Je m'explique un peu parce ke hors contexte,
J'ai une table 'table' qui contient diverses valeurs par mois et par annee.
J'ai une table 'choix' qui contient un champ 'index', un champ 'requete'.
Quand je clique sur un élément du menu, je mets à jour un fichier dans lequel j'écris un code (qui correspond à l'index).
Et au chargement de ma page, je lis le code qu'il y a dans le fichier, je fais une requête sur ma table 'choix' avec ce code (select requete from choix where index=code)...
Maintenant ke g ma requete, je la lance sur le serveur avec le mois et l'année correspondant au choix de l'utilisateur (liste au dessus)...
Marsh Posté le 29-05-2001 à 16:44:53
C'est vrai... C toujours chiant de s'exprimer quand y'a pô le contexte...
Marsh Posté le 28-05-2001 à 12:24:24
En gros, il faut que je fasse une somme d'un champ sur un cumul de 12 mois à partir d'une date donnée
Pour l'instant, je ne m'occupe pô de la date donnée, j'ai fait une requête avec des valeurs fixes...
Voici la douloureuse :
sql = "select sum(eprdhyd_e) from table where (annee='2001' and mois between '01' and '02') and (annee='2000' and mois between '03' and '12')"
Ben, marche pô... je veux la somme des valeurs de 'eprdhyd_e' du 03/2000 au 02/2001 (la date donnée sera 02/2001)
---------------
-- Le MaM is back --