Précédent   Forum des professionnels en informatique > Bases de données > Oracle > PL/SQL
PL/SQL Forum d'entraide sur le PL/SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 15/02/2011, 13h29   #1
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Par défaut Optimiser trois requêtes en une

Bonjour,

Je dois optimiser trois requêtes en une seule.
J'ai quatre requêtes PL/SQL qui doivent me retourner des nombres :
une me retourne le nombre max et les trois autres me retournent un nombre compris entre deux dates.

Tous cela par rapport à la date entrée par l'utilisateur.
En gros c'est un tableau :

Code :
1
2
3
4
5
------  M-3 M-2 M-1 totale
ligne 1
ligne 2
ligne 3
ligne4
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
PROCEDURE etatstat1 (in_date1 IN VARCHAR2, out_inum OUT tbl_integer, out_mois3 OUT tbl_integer, out_mois2 OUT tbl_integer, out_mois1 OUT tbl_integer, out_total OUT tbl_integer)
	AS
 
var_count	 INTEGER;
var_count1  INTEGER;
var_count2  INTEGER;
var_count3  INTEGER;
var_date		DATE;
var_date1		DATE;
var_date2		DATE;
var_date3		DATE;
 
	BEGIN
 
		var_date := TO_DATE(in_date1, 'dd/mm/yyyy');
		var_date1 := ADD_MONTHS(var_date, -1);
		var_date2 := ADD_MONTHS(var_date, -2);
		var_date3 := ADD_MONTHS(var_date, -3);
 
 
		out_inum(1) := 1; ON rempli la premiere ligne du tableau 
 
-- cette requête permet de calculer le nombre total de la première ligne
 
		SELECT	COUNT(DISTINCT H1.ienseignant) INTO var_count FROM r_histo_etats_enseignants H1
		WHERE	H1.ietat IN (2,3,4,7)
		AND	H1.date_effet_ens IN (SELECT MAX(date_effet_ens) FROM r_histo_etats_enseignants H2
						WHERE	H1.ienseignant = H2.ienseignant
						AND	H2.date_effet_ens <= var_date );
 
		out_total(1) := NVL(var_count,0);
 
-- cette requête permet de calculer le nombre du mois M-1 de la première ligne comprise entre var_date1 et var_date
 
		SELECT	COUNT(DISTINCT H1.ienseignant) INTO var_count FROM r_histo_etats_enseignants H1
		WHERE	H1.date_effet_ens BETWEEN var_date1 AND var_date
		AND	H1.date_effet_ens IN (SELECT MIN(date_effet_ens) FROM r_histo_etats_enseignants H2
						WHERE	H1.ienseignant = H2.ienseignant
						AND	H2.ietat IN (2,3,4,7));
 
 
-- cette requête permet de calculer le nombre du moi M-2 de la première ligne comprise entre var_date2 et var_date1
 
		out_mois1(1) := NVL(var_count,0);
 
		SELECT	COUNT(DISTINCT H1.ienseignant) INTO var_count FROM r_histo_etats_enseignants H1
		WHERE	H1.date_effet_ens BETWEEN var_date2 AND var_date1
		AND	H1.date_effet_ens IN (SELECT MIN(date_effet_ens) FROM r_histo_etats_enseignants H2
						WHERE	H1.ienseignant = H2.ienseignant
						AND	H2.ietat IN (2,3,4,7));
 
		out_mois2(1) := NVL(var_count,0);
 
 
-- cette requête permet de calculer le nombre du moi M-1 de la première ligne comprise entre var_date2 et var_date3
 
 
		SELECT	COUNT(DISTINCT H1.ienseignant) INTO var_count FROM r_histo_etats_enseignants H1
		WHERE	H1.date_effet_ens BETWEEN var_date3 AND var_date2
		AND	H1.date_effet_ens IN (SELECT MIN(date_effet_ens) FROM r_histo_etats_enseignants H2
						WHERE	H1.ienseignant = H2.ienseignant
						AND	H2.ietat IN (2,3,4,7));
 
		out_mois3(1) := NVL(var_count,0);
 
-- après on passe à remplir la 2ème ligne et ainsi de suite.
souf_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 13h55   #2
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 459
Points : 10 459
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
Avec un petit jeu de données de votre table r_histo_etats_enseignants et ce que vous en attendez, ce sera plus facile de vous aider.
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 15/02/2011, 16h45   #3
Membre chevronné
 
Homme O. Joly
Support
Inscription : décembre 2010
Messages : 287
Détails du profil
Informations personnelles :
Nom : Homme O. Joly
Âge : 38
Localisation : France, Seine et Marne (Île de France)

Informations professionnelles :
Activité : Support
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : décembre 2010
Messages : 287
Points : 617
Points : 617
Si j'ai bien compris votre souci, le SQL ci dessous devrait résoudre votre problématique :

Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
SELECT count ( DISTINCT case
                        when  H1.ietat IN (2,3,4,7)
                         AND  H1.date_effet_ens IN (SELECT MAX(date_effet_ens) 
                                                    FROM r_histo_etats_enseignants H2
                                                    WHERE  H1.ienseignant = H2.ienseignant
                                                    AND  H2.date_effet_ens <= var_date ) 
                        then H1.ienseignant 
                        else  NULL 
                        end )  v1
     , count ( DISTINCT case
                        when  H1.date_effet_ens BETWEEN var_date1 AND var_date
                         AND  H1.date_effet_ens IN (SELECT MIN(date_effet_ens) 
                                                    FROM r_histo_etats_enseignants H2
                                                    WHERE  H1.ienseignant = H2.ienseignant
                                                    AND  H2.ietat IN (2,3,4,7)) 
                        then  H1.ienseignant 
                        else NULL 
                        end )  v2
     , count ( DISTINCT case
                        when H1.date_effet_ens BETWEEN var_date2 AND var_date1
                         AND H1.date_effet_ens IN (SELECT MIN(date_effet_ens) 
                                                   FROM r_histo_etats_enseignants H2
                                                   WHERE  H1.ienseignant = H2.ienseignant
                                                   AND  H2.ietat IN (2,3,4,7)) 
                        then  H1.ienseignant 
                        else NULL 
                        end ) v3
     , count ( DISTINCT case
                        when H1.date_effet_ens BETWEEN var_date3 AND var_date2
                         AND H1.date_effet_ens IN (SELECT MIN(date_effet_ens) 
                                                   FROM r_histo_etats_enseignants H2
                                                   WHERE  H1.ienseignant = H2.ienseignant
                                                   AND  H2.ietat IN (2,3,4,7)) 
                        then  H1.ienseignant 
                        else NULL 
                        end ) v3
  INTO vout1
     , vout2
     , vout3
     , vout4
FROM r_histo_etats_enseignants H1
ojo77 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 10h41   #4
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Par défaut solution

J'ai trouvé la solution des trois requêtes en une seule, là je cherche à ajouter le quatrième qui calcule le max comme ça j'aurais une seule requête si ça peut intéresser quelqu'un voila la solution :
Code :
1
2
3
4
5
6
7
8
9
SELECT sum(nb) AS nb, sum(nb1) AS nb1, sum(nb2) AS nb2 FROM (
SELECT 
CASE when (min(date_effet_ens) BETWEEN '10/09/2009' AND '10/10/2009') then count(DISTINCT(ienseignant)) ELSE 0 END AS nb,
CASE when (min(date_effet_ens) BETWEEN '10/08/2009' AND '10/09/2009' ) then count(DISTINCT(ienseignant)) ELSE 0 END AS nb1,
CASE when (min(date_effet_ens) BETWEEN  '10/07/2009' AND '10/08/2009' ) then count(DISTINCT(ienseignant)) ELSE 0 END AS nb2
FROM r_histo_etats_enseignants 
WHERE	
ietat IN (2,3,4,7)
GROUP BY ienseignant);
Il reste à mettre les dates renseignées dans des valeurs ça marche très bien il me reste a ajouter un autre case pour la quatrième requête.
souf_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 16h43   #5
Invité de passage
 
Inscription : février 2011
Messages : 48
Détails du profil
Informations forums :
Inscription : février 2011
Messages : 48
Points : 1
Points : 1
Par défaut clause INTO est attendue

ça marche trés bien ce que j'ai écri coté sql mais une fois dans la procédure il me dise


Erreur(55,1): PLS-00428: une clause INTO est attendue dans cette instruction SELECT

comment mettre récupéré ces valeurs?
souf_87 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 18/02/2011, 16h47   #6
Expert Confirmé
 
Avatar de 7gyY9w1ZY6ySRgPeaefZ
 
Homme
dba
Inscription : juillet 2007
Messages : 2 520
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Canada

Informations professionnelles :
Activité : dba

Informations forums :
Inscription : juillet 2007
Messages : 2 520
Points : 3 967
Points : 3 967
http://sheikyerbouti.developpez.com/...=Chap1#L1.2.20
__________________
les règles du forum - mode d'emploi du forum
Aucun navigateur ne propose d'extension boule-de-cristal : postez votre code et vos messages d'erreurs.
(Rappel : "ça ne marche pas" n'est pas un message d'erreur)
JE NE RÉPONDS PAS aux questions techniques par message privé.
Écrire en français sur un forum est une marque minimale de respect.
7gyY9w1ZY6ySRgPeaefZ est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 10h56.


 
 
 
 
Partenaires

Hébergement Web