[asp][sql] Requête trop balaise à faire...

Requête trop balaise à faire... [asp][sql] - Programmation

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  :ouch:
 
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 --
Reply

Marsh Posté le 28-05-2001 à 12:24:24   

Reply

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

Reply

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 :
  1. select sum(toto)
  2. from
  3.        table
  4. where
  5.        annee * 100 + mois between (annee_debut * 100 + mois_debut) and (annee_fin * 100 + mois_fin)


 
Comme ça, tu prends n'importe quelle période, ça marchera à tous les coups.

Reply

Marsh Posté le 28-05-2001 à 13:11:38    

Trictrac -> Ta soeur pov'con  :D (nan, je préfère celle du Lux  :love: )...
 
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...  :sol:


---------------
-- Le MaM is back --
Reply

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...


---------------
-- Le MaM is back --
Reply

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 :D
 
PS : un OR à la place d'un AND CAI LA MORT :o

Reply

Marsh Posté le 28-05-2001 à 13:39:57    

:bounce:  cool j'allais justement te poser la question fred pour la multiplication par 100.
 :hap:

Reply

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.  :D  
 
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  :pt1cable: )
 
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...  :benetton:


---------------
-- Le MaM is back --
Reply

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..

Reply

Marsh Posté le 28-05-2001 à 13:52:02    

:crazy:  :ouch:  :sweat:  :sweat:  :sleep:  :sleep:  ;)  ;)  :sol:  :eek2:  :eek2:  :cry: boh, j'abandonne.....................  :cry:  :hot:  :hot:  :hot:  :hot:  :hot:  :hot:  :gun:  :gun:  :gun:  :gun:  :eek2:  
 
 
 
ARRGGGHHHH, JE CRAQUE !!!!!


---------------
-- Le MaM is back --
Reply

Marsh Posté le 28-05-2001 à 13:52:02   

Reply

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)

Reply

Marsh Posté le 28-05-2001 à 13:58:44    

hihhi.. salut Fred999 !!!!!
T'en a fais craquer un .. :D
Bref, ta technique est cool...
La multiplication par 100 c pour tenir compte des mois pour ceux ki l'aurait pas vu .. :D:D je fais celui ki a l'air d'avoir compris :p...
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.


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

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...


---------------
-- Le MaM is back --
Reply

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.

Reply

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.. :??:


---------------
"C'est le boulot qu'on ne commence jamais qui est le plus long à terminer"
Reply

Marsh Posté le 28-05-2001 à 15:15:50    

Waouh alors là ce serait très fort.

Reply

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]

Reply

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...


---------------
-- Le MaM is back --
Reply

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... :sarcastic:

 

[edit]--Message édité par irulan--[/edit]

Reply

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...


---------------
-- Le MaM is back --
Reply

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.

Reply

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,  :pt1cable:  
 
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)...   :hap:


---------------
-- Le MaM is back --
Reply

Marsh Posté le 29-05-2001 à 14:34:16    

OK d'ac.
 
Reconnais qu'on pouvait se poser des questions!

Reply

Marsh Posté le 29-05-2001 à 16:44:53    

C'est vrai... C toujours chiant de s'exprimer quand y'a pô le contexte...


---------------
-- Le MaM is back --
Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed