Bonjour,
J'ai un problème pour la création d'une requête en PL/SQL (Oracle).
Voici le problème,
Je dois afficher des données mensuelles pour les diffèrents produits que nous avons (nombre totals de produit par mois, la moyenne du nombre de produit journalier, le pic du nombre de produit dans le mois et la date de ce pic) comme suit :
Dans un mois nous pouvons avoir plusieurs date pour un même pic.
[IMG]C:\tmp\tabDonnesPrdt.bmp[/IMG]
Pour cela je voudrai faire la requête suivante :
Le problème est au niveau de l'affichage de la Date du pic, je ne peux pas le mettre dans le regroupement(group by) car sinon je n'ai plus les moyennes et les sommes par mois mais par jour.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 select to_char(eventdate, 'yyyy/mm') as MOIS, Nom_Produit as Nom, SUM(Nb_Produits) as Nb_de_produits_Total, AVG(Nb_Produits) as Moyenne_nb_de_produits_journalier, MAX(Nb_Produits) as Pic_Nb_Produit, date as Date_Du_Pic from historic_1656379283 group by to_char(eventdate, 'yyyy/mm'),Nom_Produit order by to_char(eventdate, 'yyyy/mm') desc;
Cette requête envoie donc une erreur si je ne mets pas date dans le group by.
Pour contourner le problème j'ai créé deux curseurs une qui me donne tout les résultats sauf la date du pic et l'autre qui récupère la date du pic en fonction du mois, de nom du produit et du pic récupérés par les résultats du premier curseur.
Ce qui me donne le code suivant dans le begin :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18 Curseur statProduit is select to_char(eventdate, 'yyyy/mm') as MOIS, Nom_Produit as Nom, SUM(Nb_Produits) as Nb_de_produits_Total, AVG(Nb_Produits) as Moyenne_nb_de_produits_journalier, MAX(Nb_Produits) as Pic_Nb_Produit from historic_1656379283 group by to_char(eventdate, 'yyyy/mm'),Nom_Produit order by to_char(eventdate, 'yyyy/mm') desc; Curseur DatePic(mois varchar, nomPdt varchar, picduMois int) is select date as Date_Du_Pic from historic_1656379283 Where Nom_Produit = nomPdt and to_char(eventdate, 'yyyy/mm')=mois and Nb_Produits=picduMois group by to_char(eventdate, 'yyyy/mm'),Nom_Produit order by to_char(eventdate, 'yyyy/mm') desc;
Le problème de cette méthode et qu'elle prend enormément de temps à s'exécuter lors de la recherche de la date pour chaque ligne (pour 400 lignes de résultat = env 1h)
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19 begin OPEN statProduit; LOOP FETCH statProduit INTO ChaquestatProduit; Exit when statProduit%NOTFOUND ; OPEN DatePic(ChaquestatProduit.MOIS,ChaquestatProduit.Nom,ChaquestatProduit.Pic_Nb_Produit); LOOP FETCH DatePic INTO ChaqueDatePic; Exit when DatePic%NOTFOUND ; REQ:='insert into TAB_STATSCRE_MEMensuel(MOIS,NOMPDT,MOYENNEPDT,PICPDT,DATE_DU_PIC) values (' || '''' || ChaquestatProduit.MOIS || '''' || ',' || '''' || ChaquestatProduit.Nom || '''' || ',' || '''' || ChaquestatProduit.Nb_de_produits_Total || '''' || ',' || '''' || ChaquestatProduit.Pic_Nb_Produit || '''' || ',' || '''' || ChaqueDatePic.Date_Du_Pic || '''' || ')'; dbms_output.put_line('insert into TAB_STATSCRE_MEMensuel(MOIS,NOMPDT,MOYENNEPDT,PICPDT,DATE_DU_PIC) values (' || '''' || ChaquestatProduit.MOIS || '''' || ',' || '''' || ChaquestatProduit.Nom || '''' || ',' || '''' || ChaquestatProduit.Nb_de_produits_Total || '''' || ',' || '''' || ChaquestatProduit.Pic_Nb_Produit || '''' || ',' || '''' || ChaqueDatePic.Date_Du_Pic || '''' || ')'); EXECUTE IMMEDIATE REQ; END LOOP; CLOSE DatePic; END LOOP; CLOSE statProduit;
Y'a t'il un moyen de récupérer la date avec la première requête sans mettre la date dans le group by?
Ou bien avez vous une idée pour réduire le temps de recherche de la date?
Merci d'avance.
Partager