requete redondante

requete redondante - SQL/NoSQL - Programmation

Marsh Posté le 03-08-2009 à 22:55:45    

Bonjour,
 
j'ai une requete sous Oracle qui retourne quatre champs en Une ligne  
Cette requete je dois la faire tourner 60 fois ( pour les 5 ans * 12 mois suivants le 31/03/2009 ) , les mois sot consecutifs
Et donc j’aimerai bien automatiser cette tache  
Ps : ma requete est tres simplifié ici , à la base pour un seul select ( sur un mois) elle prend vers les 4 ou 5 minutes  
et donc j'ai fait vite fait quelque chose du genre :
 
BEGIN
 FOR i IN  1 .. 60 LOOP
Select max(var)
From table1
Where date > ‘2009/03/31’
Union
Select max(var)
From table1
Where date > add_months(‘2002/03/31’,i)
End loop;
End;
 
je ne sais pas si c'est une bonne piste , merci de vouloir m'aider  

Reply

Marsh Posté le 03-08-2009 à 22:55:45   

Reply

Marsh Posté le 04-08-2009 à 08:39:41    

Tu ferais mieux de faire un group by extraire_le_mois(date)

Reply

Marsh Posté le 04-08-2009 à 08:51:53    

Taz a écrit :

Tu ferais mieux de faire un group by extraire_le_mois(date)


j'avais pensé à proposer ca, mais j'avais peur de dire une betise... pour ma culture, ca peut gagner beaucoup en temps d'exécution et sur le calcul du plan et tout et tout?

Reply

Marsh Posté le 04-08-2009 à 12:36:57    

merci pour vos réponses, il faut que je m'explique peut etre mieux parce que je n'ai pas compris l'interet d'un group by, je n'ai rien à grouper, ne vous fiez pas au code que j'ai mis c'était pour illuster un peu vaguement;  
le probleme est : j'ai cette requete qui me renvoie une ligne pour la date 31/03/2001
je dois la faire tourner sur les 60 mois suivants , et donc je vais tourner la requete 60 fois pour avoir 60 ligne ( chaque ligne je la copie sur un fichier excel avant de passer au mois suivant)
moi, je cherche quelque chose qui me permet d'avoir les 60 lignes à la fois , cela fait pe,ser directement à une boucle pour les mois add_months(mois,i) , et des unions sur les lignes pour avoir une seule table à la fin  
peut etre je suis sur la bonne piste (il faut chercher dans ce cas comment integrer UNION dans la boucle) , ou peut etre que je suis à coté

Reply

Marsh Posté le 04-08-2009 à 14:34:43    

fais plutot un truc genre ci-dessous, si je comprend bien tes données un group by ne renverrait pas un résultat correct car tu veux des résultats sur des périodes qui peuvent se chevaucher( si c'est pas le cas alors oui fais un group by)
 
 

Code :
  1. param_max_var number;
  2.  
  3. BEGIN
  4. FOR i IN  1 .. 60 LOOP
  5.    SELECT max(var) INTO param_max_var
  6.   FROM table1
  7.   WHERE date > add_months(2002/03/31’,i);
  8.  
  9.   INSERT INTO une_table_destination VALUES (add_months(2002/03/31’,i),param_max_var);
  10.  commit;
  11. End loop;
  12. End;

Reply

Marsh Posté le 04-08-2009 à 14:41:03    

pataluc a écrit :


j'avais pensé à proposer ca, mais j'avais peur de dire une betise... pour ma culture, ca peut gagner beaucoup en temps d'exécution et sur le calcul du plan et tout et tout?


Oui à fond !

Reply

Marsh Posté le 04-08-2009 à 16:22:08    

ay casimimir , c'est un peu quelque chose comme ça qui me faut, j'ai pas les privileges pour faire un INSERT, en core moins un CREATE TABLE, que des SELECT, c'est pour ça que je parle de Union ou union all
 
pour faire simple , ma requete en gros est du type :
select max(montant)
from ma_table
where date > ma_date ;
franchement je bloque sur le group by, ça m'obligera de tout recommencer ...

Reply

Sujets relatifs:

Leave a Replay

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