IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PL/SQL Oracle Discussion :

Optimiser trois requêtes en une


Sujet :

PL/SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    ------  M-3 M-2 M-1 totale
    ligne 1
    ligne 2
    ligne 3
    ligne4
    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
    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.

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    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.

  3. #3
    Membre Expert Avatar de ojo77
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Décembre 2010
    Messages
    680
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Décembre 2010
    Messages : 680
    Par défaut
    Si j'ai bien compris votre souci, le SQL ci dessous devrait résoudre votre problématique :

    Code sql : 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
    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

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2011
    Messages
    55
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 55
    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?

  6. #6

Discussions similaires

  1. [MySQL] Trois requêtes dans une variable PHP à renvoyer
    Par AyManoVic dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 01/02/2011, 10h02
  2. Trois requêtes en une ?
    Par Virevolte dans le forum Langage SQL
    Réponses: 2
    Dernier message: 15/10/2010, 16h29
  3. Optimisation de requête pour une messagerie
    Par okin66 dans le forum Requêtes
    Réponses: 0
    Dernier message: 31/05/2009, 15h39
  4. Réponses: 4
    Dernier message: 07/10/2008, 14h16
  5. Trois requêtes en une seule
    Par korg-pa80 dans le forum Langage
    Réponses: 5
    Dernier message: 23/06/2008, 11h26

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo