Bonjour,
Je suis sous Access 2003.
Mes requetes sont souvent bas=E9es sur des requetes qui, elles-m=EAme sont
bas=E9es sur des requetes, etc... (la table de d=E9part d=E9passe 40 000
lignes).Lorsque la cha=EEne de sous-requetes d=E9passe 5 ou 6 requetes,
l'ex=E9cution est tr=E8s lente.
A d=E9faut de solution, pour =E9viter ces lenteurs, je cr=E9e une nouvelle
base dans laquelle il n'y a que la derni=E8re requete bas=E9e sur une
table qui est une importation de la derni=E8re sous-requete.
Existe-t-il d'autres m=E9thodes pour =E9viter ces lenteurs ?
Merci d'avance
Eric
a écrit : > Bonjour > > Il n'y a pas d'urgence...Fais ce que tu peux;... ce que tu m'as donné > m'a bcp servi > > Je cherche à avoir le taux d'emploi par diplome. > La difficulté vient du fait qu'il ne faut retenir que les > enregistrements qui sont > 34 par année (Count(DIPLOME_PRE)>34) et il > faut que la somme des enregistrements sur les 3 années (2006, 2007 et > 2008) soit > 120 > C'est pour cela que j'ai procédé en plusieurs étapes, d'où trop de > requetes => lenteur. > > > > I) 1re étape: Exclusion des enregistrements <35 et dont le total <120 > > > req1.1 : je crée "Req1" qui exclut les enregistrements <35 : > SELECT Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200, > Sum(Terminants2.POND) AS SommeDePOND, Count(Terminants2.DIPLOME_PRE) AS > CompteDeDIPLOME_PRE, Terminants2.ANNEE > FROM Terminants2 > GROUP BY Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200, > Terminants2.ANNEE HAVING (((Count(Terminants2.DIPLOME_PRE))>34)); > > > > req 1.2 : Avec "Req1", je crée une req croisée par année "Req2": > TRANSFORM Sum(Req1.CompteDeDIPLOME_PRE) > SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > FROM Req1 > GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > > > > req 1.3 : Avec "Req2", j'exclus les enregistrements <120 sur les 3 > années => "Req3" : > SELECT Req2.DIPLOME_PRE, Req2.LIBELLE_LONG_200, Req2.[2006], > Req2.[2007], Req2.[2008], [2006]+[2007]+[2008] AS total > FROM Req2 > WHERE ((([2006]+[2007]+[2008])>120)) > ORDER BY Req2.DIPLOME_PRE; > > Avec cette 1re sous-requete "Req3", je n'ai pas l'info essentielle qui > est le champ "POND"; je n'ai fait pour l'instant qu'exclure les > enregistrements qui ne m'interessent pas. > > > > II) 2me étape : traitement de l'info "POND" > req 2.1 : Avec "Req1", je crée une req croisée par année "Req4" : > TRANSFORM Sum(Req1.SommeDePOND) AS SommeDePOND > SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > FROM Req1 > GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > PIVOT Req1.ANNEE; > > > > III) 3me étape : Jointure entre 1re et 2me étape ("Req3" avec "Req4" qui > donnent "Req5") pour ne retenir que les données POND qui correspondent à > mes critères de la 1re étape > SELECT Req4.* FROM Req4 INNER JOIN Req3 ON Req4.DIPLOME_PRE > Req3.DIPLOME_PRE; > > > > IV) 4° étape : requete qui me donnent ceux qui sont en emploi =>"Req6" > TRANSFORM Sum(Terminants2.POND) AS SommeDePOND > SELECT Terminants2.DIPLOME_PRE > FROM Terminants2 > WHERE (((Terminants2.KSIQ)="3")) > GROUP BY Terminants2.DIPLOME_PRE, Terminants2.KSIQ > PIVOT Terminants2.ANNEE; > > > > V) Ultime étape : le taux d'emploi (jointure entre 3° et 4° étape) > SELECT Req6.DIPLOME_PRE, Req6.LIBELLE_LONG_200, Req6.[2006], > Req5.[2006], Req6.[2007], Req5.[2007], Req6.[2008], Req5.[2008] > FROM Req6 INNER JOIN Req5 ON Req6.DIPLOME_PRE = Req5.DIPLOME_PRE; > > Merci beaucoup > > Eric
Regarde si les 3 requêtes suivantes te donne le résultat souhaité :
Req1: SELECT T2.[DIPLOME_PRE] FROM [SELECT T1.ANNEE, T1.[DIPLOME_PRE], Count(T1.[DIPLOME_PRE] AS CompteDe FROM Terminants2 AS T1 GROUP BY T1.ANNEE, T1.[DIPLOME_PRE] HAVING Count(T1.[DIPLOME_PRE])>34]. AS T2 WHERE T2.ANNEE Between 2006 And 2008 GROUP BY T2.[DIPLOME_PRE] HAVING Sum(T2.CompteDe)>120;
Req2: SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND) AS SommeDePOND FROM Terminants2 AS T1 INNER JOIN Req1 AS T2 ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE] GROUP BY T1.ANNEE, T1.[DIPLOME_PRE] UNION SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND) FROM Terminants2 AS T1 INNER JOIN Req1 AS T2 ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE] WHERE T1.KSIQ="3" GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];
TRANSFORM First(T1.SommeDePOND) AS Valeur SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200] FROM Req2 AS T1 INNER JOIN V_FormDiplOct2008 AS T2 ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME] GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200] PIVOT T1.ANNEE & "_" & T1.ChampPivot;
Bonjour,
eric.zzzz@club-internet.fr a écrit :
> Bonjour
>
> Il n'y a pas d'urgence...Fais ce que tu peux;... ce que tu m'as donné
> m'a bcp servi
>
> Je cherche à avoir le taux d'emploi par diplome.
> La difficulté vient du fait qu'il ne faut retenir que les
> enregistrements qui sont > 34 par année (Count(DIPLOME_PRE)>34) et il
> faut que la somme des enregistrements sur les 3 années (2006, 2007 et
> 2008) soit > 120
> C'est pour cela que j'ai procédé en plusieurs étapes, d'où trop de
> requetes => lenteur.
>
>
>
> I) 1re étape: Exclusion des enregistrements <35 et dont le total <120
>
>
> req1.1 : je crée "Req1" qui exclut les enregistrements <35 :
> SELECT Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Sum(Terminants2.POND) AS SommeDePOND, Count(Terminants2.DIPLOME_PRE) AS
> CompteDeDIPLOME_PRE, Terminants2.ANNEE
> FROM Terminants2
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200,
> Terminants2.ANNEE HAVING (((Count(Terminants2.DIPLOME_PRE))>34));
>
>
>
> req 1.2 : Avec "Req1", je crée une req croisée par année "Req2":
> TRANSFORM Sum(Req1.CompteDeDIPLOME_PRE)
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
>
>
>
> req 1.3 : Avec "Req2", j'exclus les enregistrements <120 sur les 3
> années => "Req3" :
> SELECT Req2.DIPLOME_PRE, Req2.LIBELLE_LONG_200, Req2.[2006],
> Req2.[2007], Req2.[2008], [2006]+[2007]+[2008] AS total
> FROM Req2
> WHERE ((([2006]+[2007]+[2008])>120))
> ORDER BY Req2.DIPLOME_PRE;
>
> Avec cette 1re sous-requete "Req3", je n'ai pas l'info essentielle qui
> est le champ "POND"; je n'ai fait pour l'instant qu'exclure les
> enregistrements qui ne m'interessent pas.
>
>
>
> II) 2me étape : traitement de l'info "POND"
> req 2.1 : Avec "Req1", je crée une req croisée par année "Req4" :
> TRANSFORM Sum(Req1.SommeDePOND) AS SommeDePOND
> SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> FROM Req1
> GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200
> PIVOT Req1.ANNEE;
>
>
>
> III) 3me étape : Jointure entre 1re et 2me étape ("Req3" avec "Req4" qui
> donnent "Req5") pour ne retenir que les données POND qui correspondent à
> mes critères de la 1re étape
> SELECT Req4.* FROM Req4 INNER JOIN Req3 ON Req4.DIPLOME_PRE > Req3.DIPLOME_PRE;
>
>
>
> IV) 4° étape : requete qui me donnent ceux qui sont en emploi =>"Req6"
> TRANSFORM Sum(Terminants2.POND) AS SommeDePOND
> SELECT Terminants2.DIPLOME_PRE
> FROM Terminants2
> WHERE (((Terminants2.KSIQ)="3"))
> GROUP BY Terminants2.DIPLOME_PRE, Terminants2.KSIQ
> PIVOT Terminants2.ANNEE;
>
>
>
> V) Ultime étape : le taux d'emploi (jointure entre 3° et 4° étape)
> SELECT Req6.DIPLOME_PRE, Req6.LIBELLE_LONG_200, Req6.[2006],
> Req5.[2006], Req6.[2007], Req5.[2007], Req6.[2008], Req5.[2008]
> FROM Req6 INNER JOIN Req5 ON Req6.DIPLOME_PRE = Req5.DIPLOME_PRE;
>
> Merci beaucoup
>
> Eric
Regarde si les 3 requêtes suivantes te donne le résultat souhaité :
Req1:
SELECT T2.[DIPLOME_PRE]
FROM [SELECT T1.ANNEE, T1.[DIPLOME_PRE],
Count(T1.[DIPLOME_PRE] AS CompteDe
FROM Terminants2 AS T1
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
HAVING Count(T1.[DIPLOME_PRE])>34]. AS T2
WHERE T2.ANNEE Between 2006 And 2008
GROUP BY T2.[DIPLOME_PRE]
HAVING Sum(T2.CompteDe)>120;
Req2:
SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE],
Sum(T1.POND) AS SommeDePOND
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE]
UNION
SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND)
FROM Terminants2 AS T1 INNER JOIN Req1 AS T2
ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE]
WHERE T1.KSIQ="3"
GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];
TRANSFORM First(T1.SommeDePOND) AS Valeur
SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
FROM Req2 AS T1 INNER JOIN V_FormDiplOct2008 AS T2
ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME]
GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200]
PIVOT T1.ANNEE & "_" & T1.ChampPivot;
a écrit : > Bonjour > > Il n'y a pas d'urgence...Fais ce que tu peux;... ce que tu m'as donné > m'a bcp servi > > Je cherche à avoir le taux d'emploi par diplome. > La difficulté vient du fait qu'il ne faut retenir que les > enregistrements qui sont > 34 par année (Count(DIPLOME_PRE)>34) et il > faut que la somme des enregistrements sur les 3 années (2006, 2007 et > 2008) soit > 120 > C'est pour cela que j'ai procédé en plusieurs étapes, d'où trop de > requetes => lenteur. > > > > I) 1re étape: Exclusion des enregistrements <35 et dont le total <120 > > > req1.1 : je crée "Req1" qui exclut les enregistrements <35 : > SELECT Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200, > Sum(Terminants2.POND) AS SommeDePOND, Count(Terminants2.DIPLOME_PRE) AS > CompteDeDIPLOME_PRE, Terminants2.ANNEE > FROM Terminants2 > GROUP BY Terminants2.DIPLOME_PRE, Terminants2.LIBELLE_LONG_200, > Terminants2.ANNEE HAVING (((Count(Terminants2.DIPLOME_PRE))>34)); > > > > req 1.2 : Avec "Req1", je crée une req croisée par année "Req2": > TRANSFORM Sum(Req1.CompteDeDIPLOME_PRE) > SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > FROM Req1 > GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > > > > req 1.3 : Avec "Req2", j'exclus les enregistrements <120 sur les 3 > années => "Req3" : > SELECT Req2.DIPLOME_PRE, Req2.LIBELLE_LONG_200, Req2.[2006], > Req2.[2007], Req2.[2008], [2006]+[2007]+[2008] AS total > FROM Req2 > WHERE ((([2006]+[2007]+[2008])>120)) > ORDER BY Req2.DIPLOME_PRE; > > Avec cette 1re sous-requete "Req3", je n'ai pas l'info essentielle qui > est le champ "POND"; je n'ai fait pour l'instant qu'exclure les > enregistrements qui ne m'interessent pas. > > > > II) 2me étape : traitement de l'info "POND" > req 2.1 : Avec "Req1", je crée une req croisée par année "Req4" : > TRANSFORM Sum(Req1.SommeDePOND) AS SommeDePOND > SELECT Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > FROM Req1 > GROUP BY Req1.DIPLOME_PRE, Req1.LIBELLE_LONG_200 > PIVOT Req1.ANNEE; > > > > III) 3me étape : Jointure entre 1re et 2me étape ("Req3" avec "Req4" qui > donnent "Req5") pour ne retenir que les données POND qui correspondent à > mes critères de la 1re étape > SELECT Req4.* FROM Req4 INNER JOIN Req3 ON Req4.DIPLOME_PRE > Req3.DIPLOME_PRE; > > > > IV) 4° étape : requete qui me donnent ceux qui sont en emploi =>"Req6" > TRANSFORM Sum(Terminants2.POND) AS SommeDePOND > SELECT Terminants2.DIPLOME_PRE > FROM Terminants2 > WHERE (((Terminants2.KSIQ)="3")) > GROUP BY Terminants2.DIPLOME_PRE, Terminants2.KSIQ > PIVOT Terminants2.ANNEE; > > > > V) Ultime étape : le taux d'emploi (jointure entre 3° et 4° étape) > SELECT Req6.DIPLOME_PRE, Req6.LIBELLE_LONG_200, Req6.[2006], > Req5.[2006], Req6.[2007], Req5.[2007], Req6.[2008], Req5.[2008] > FROM Req6 INNER JOIN Req5 ON Req6.DIPLOME_PRE = Req5.DIPLOME_PRE; > > Merci beaucoup > > Eric
Regarde si les 3 requêtes suivantes te donne le résultat souhaité :
Req1: SELECT T2.[DIPLOME_PRE] FROM [SELECT T1.ANNEE, T1.[DIPLOME_PRE], Count(T1.[DIPLOME_PRE] AS CompteDe FROM Terminants2 AS T1 GROUP BY T1.ANNEE, T1.[DIPLOME_PRE] HAVING Count(T1.[DIPLOME_PRE])>34]. AS T2 WHERE T2.ANNEE Between 2006 And 2008 GROUP BY T2.[DIPLOME_PRE] HAVING Sum(T2.CompteDe)>120;
Req2: SELECT "R1" AS ChampPivot, T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND) AS SommeDePOND FROM Terminants2 AS T1 INNER JOIN Req1 AS T2 ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE] GROUP BY T1.ANNEE, T1.[DIPLOME_PRE] UNION SELECT "R2", T1.ANNEE, T1.[DIPLOME_PRE], Sum(T1.POND) FROM Terminants2 AS T1 INNER JOIN Req1 AS T2 ON T1.[DIPLOME_PRE] = T2.[DIPLOME_PRE] WHERE T1.KSIQ="3" GROUP BY T1.ANNEE, T1.[DIPLOME_PRE];
TRANSFORM First(T1.SommeDePOND) AS Valeur SELECT T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200] FROM Req2 AS T1 INNER JOIN V_FormDiplOct2008 AS T2 ON T1.[DIPLOME_PRE] = T2.[FORMATION_DIPLOME] GROUP BY T1.[DIPLOME_PRE], T2.[LIBELLE_LONG_200] PIVOT T1.ANNEE & "_" & T1.ChampPivot;