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

Requêtes et SQL. Discussion :

Remplacer DSum par du SQL ?


Sujet :

Requêtes et SQL.

  1. #1
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut Remplacer DSum par du SQL ?
    Bonjour.

    J'ai une requête qui me donne pour une année choisie, pour chacun de mes territoire et chaque mois de l'année, le nombre d'entretiens depuis le début de l'année cumulés à la fin du mois.

    Cela donne quelque chose comme :

    • Terr01, 2016, 01, 1000 (il y a eu 1000 entretiens du 2017/01/01 au 2017/01/31)
    • Terr01, 2016, 02, 1500 (il y a eu 1000 + 500 = 1500 entretiens du 2017/01/01 au 2017/02/29)
    • Terr01, 2016, 03, 2750 (il y a eu 1000 + 500 + 1250 = 2750 entretiens du 2017/01/01 au 2017/03/30)


    et ainsi de suite jusqu'à décembre. Le détail entre parenthèses est pour expliquer comme j'ai obtenu le résultat, il n'est pas à afficher.

    Actuellement je le fais avec un DSum() dont le critère est

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]<=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois]

    Je pense que du SQL dans une requête séparée serait plus efficace.
    Je n'ai pas vérifié mais j'estime qu'une requête dans une requête ne serait pas plus efficace que le DSum()
    et rendrai la chose bien difficile à maintenir car j'ai plus d'un champ de cumul et que l'éditeur de SQL de Access ne vaut pas grand chose.

    Je ne vois absolument pas comme y parvenir sans créer une requête de cumul pour chaque mois de l'année.
    soit un truc du genre :

    reqCumul_01

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, 1 AS NoMoisCumul, Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    WHERE (((reqHP_TDBEntretien.NoMois)<=1))
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, 1
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    reqCumul_02

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, 2 AS NoMoisCumul, Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    WHERE (((reqHP_TDBEntretien.NoMois)<=2))
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, 2
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    puis de faire une jointure avec une requête qui donne tous les territoires, l'année et tous les mois de l'année.

    Quelqu'un aurait-il une idée pour éviter la création de 12 requêtes pour chacune de mes requêtes de calcul ?

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 593
    Points : 34 250
    Points
    34 250
    Par défaut
    Salut,

    tu pourrais nous indiquer la requete de depart, sans les cumuls a proprement parler ?

    Je pense qu'on devrait pouvoir trouver un bloc similaire a celui de
    https://access.developpez.com/source...ueteClassement

    c'est envisageable ou tu preferes une autre approche ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Ici le SQL sans les cumuls.

    Comme tu verras c'est un simple produit croisé.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT tblBaseTerr.[No] AS NoTerr, tblBaseTerr.Desc AS DescTerr, Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt] AS AffTerr, tblBaseTerr.EstGeographique AS EstGeographiqueTerr, tblBaseMois.[No] AS NoMois, tblBaseMois.AffMois_Initiale, reqBaseParam_NoMois.NoMois AS NoMoisCourant, "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereMens, "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]<=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereCumul
    FROM tblBaseTerr, tblBaseMois, reqBaseParam_NoMois, reqBaseParam_DateHeureDebutSAPEntretien, reqBaseParam_Annee
    WHERE (((tblBaseTerr.EstGeographique)=True) AND ((tblBaseTerr.EstActif)=True))
    ORDER BY Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt], tblBaseMois.[No];
    Je regarde ta suggestion.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  4. #4
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Et ici le SQL complet :

    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
    SELECT tblBaseTerr.[No] AS NoTerr, tblBaseTerr.Desc AS DescTerr, Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt] AS AffTerr, tblBaseTerr.EstGeographique AS EstGeographiqueTerr, tblBaseMois.[No] AS NoMois, tblBaseMois.AffMois_Initiale, reqBaseParam_NoMois.NoMois AS NoMoisCourant, 
     
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereMens, 
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]<=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereCumul, 
     
    DSum("IndicateurNonDummy","reqHP_TDBEntretien",[CritereMens])/1 AS NbEntretienMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
       DSum("IndicateurNonDummy","reqHP_TDBEntretien",[CritereCumul]),
       Null)/1 
         AS NbEntretienCumul, 
     
    DSum("TempsReel","reqSAP_Entretien",[CritereMens])/1 AS TempsReelMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
       DSum("TempsReel","reqSAP_Entretien",[CritereCumul]),
       Null)/1 
         AS TempsReelCumul, 
     
    IIf(Not IsNull([NbEntretienMens]),IIf([NbEntretienMens]<>0,[TempsReelMens]/[NbEntretienMens],Null),Null)/1 AS TempsReelMoyenMens, IIf(Not IsNull([NbEntretienCumul]),IIf([NbEntretienCumul]<>0,[TempsReelCumul]/[NbEntretienCumul],Null),Null)/1 AS TempsReelMoyenCumul
     
    FROM tblBaseTerr, tblBaseMois, reqBaseParam_NoMois, reqBaseParam_DateHeureDebutSAPEntretien, reqBaseParam_Annee
    WHERE (((tblBaseTerr.EstGeographique)=True) AND ((tblBaseTerr.EstActif)=True))
    ORDER BY Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt], tblBaseMois.[No];

    Comme on peut le voir elle est légèrement compliquée (j'ai formaté le code pour une meilleur visibilité mais dans l'éditeur de Access s'est une LONGUE ligne de SQL pas franchement facile à lire).
    Faire du SQL dans le SQL comme suggéré précédemment ne me paraît pas une super bonne idée et en plus je ne suis pas sur que cela ira plus vite.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  5. #5
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Ce que j'aimerai, si c'est possible c'est quelque chose comme :

    ReqCalculCumul_NbEntretien

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois] AS NoMoisCumul, Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    WHERE (((reqHP_TDBEntretien.NoMois)<=[prmNomois]))
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    mais qui serait appelé du SQL. Je ne vois pas comment passé [prmNoMois] qui va valloir 1, 2, ..., 12 selon [noMois] à la sous-requête.
    Ou mieux qui serait simplement en jointure sur le champ [noMois].

    Je n'aurai qu'une seule requête par champ calculé, dans cet exemple 4 requêtes.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonsoir René,

    Comme tu le sais les sous-requêtes avec Alias, sont plus rapides que les fonctions de domaine, et idéales pour les calculs de cumuls. Alors je verrais bien quelque chose comme :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois] AS NoMoisCumul, (select Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.[prmNomois])) AS NbEntretien
    FROM reqHP_TDBEntretien
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    Maintenant j'espère avoir bien compris ta demande
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  7. #7
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour et merci.

    Je me suis mal exprimé, voici la requête finale telle qu'elle est actuellement :

    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
    SELECT tblBaseTerr.[No] AS NoTerr, tblBaseTerr.Desc AS DescTerr, Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt] AS AffTerr, tblBaseTerr.EstGeographique AS EstGeographiqueTerr, tblBaseMois.[No] AS NoMois, tblBaseMois.AffMois_Initiale, reqBaseParam_NoMois.NoMois AS NoMoisCourant, 
     
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereMens, 
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]<=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereCumul, 
     
    DSum("IndicateurNonDummy","reqHP_TDBEntretien",[CritereMens])/1 AS NbEntretienMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
       DSum("IndicateurNonDummy","reqHP_TDBEntretien",[CritereCumul]),
       Null)/1 
         AS NbEntretienCumul, 
     
    DSum("TempsReel","reqSAP_Entretien",[CritereMens])/1 AS TempsReelMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
       DSum("TempsReel","reqSAP_Entretien",[CritereCumul]),
       Null)/1 
         AS TempsReelCumul, 
     
    IIf(Not IsNull([NbEntretienMens]),IIf([NbEntretienMens]<>0,[TempsReelMens]/[NbEntretienMens],Null),Null)/1 AS TempsReelMoyenMens, IIf(Not IsNull([NbEntretienCumul]),IIf([NbEntretienCumul]<>0,[TempsReelCumul]/[NbEntretienCumul],Null),Null)/1 AS TempsReelMoyenCumul
     
    FROM tblBaseTerr, tblBaseMois, reqBaseParam_NoMois, reqBaseParam_DateHeureDebutSAPEntretien, reqBaseParam_Annee
    WHERE (((tblBaseTerr.EstGeographique)=True) AND ((tblBaseTerr.EstActif)=True))
    ORDER BY Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt], tblBaseMois.[No];

    et voici la requête que j'aimerai inclure :

    ReqCalculCumul_NbEntretien

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois] AS NoMoisCumul, Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    WHERE (((reqHP_TDBEntretien.NoMois)<=[prmNomois]))
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    et ce que je pense serait bien d'avoir :
    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
    SELECT tblBaseTerr.[No] AS NoTerr, tblBaseTerr.Desc AS DescTerr, Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt] AS AffTerr, tblBaseTerr.EstGeographique AS EstGeographiqueTerr, tblBaseMois.[No] AS NoMois, tblBaseMois.AffMois_Initiale, reqBaseParam_NoMois.NoMois AS NoMoisCourant, 
     
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereMens, 
    "[NoTerr]=" & [tblBaseTerr].[No] & " and [Annee]=" & [reqBaseParam_Annee].[Annee] & " and [NoMois]<=" & [tblBaseMois].[No] & " and [NoMois]<=" & [reqBaseParam_NoMois].[NoMois] AS CritereCumul, 
     
    DSum("IndicateurNonDummy","reqHP_TDBEntretien",[CritereMens])/1 AS NbEntretienMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
    
       select [ReqCalculCumul_NbEntretien].* from [ReqCalculCumul_NbEntretien]([tblBaseMois.[NoMois))
    
       Null)/1 
         AS NbEntretienCumul, 
     
    DSum("TempsReel","reqSAP_Entretien",[CritereMens])/1 AS TempsReelMens, 
     
    IIf((Month([reqBaseParam_DateHeureDebutSAPEntretien].[DateHeure])<=[tblBaseMois].[No] And [tblBaseMois].[No]<=[reqBaseParam_NoMois].[NoMois]),
       DSum("TempsReel","reqSAP_Entretien",[CritereCumul]),
       Null)/1 
         AS TempsReelCumul, 
     
    IIf(Not IsNull([NbEntretienMens]),IIf([NbEntretienMens]<>0,[TempsReelMens]/[NbEntretienMens],Null),Null)/1 AS TempsReelMoyenMens, IIf(Not IsNull([NbEntretienCumul]),IIf([NbEntretienCumul]<>0,[TempsReelCumul]/[NbEntretienCumul],Null),Null)/1 AS TempsReelMoyenCumul
     
    FROM tblBaseTerr, tblBaseMois, reqBaseParam_NoMois, reqBaseParam_DateHeureDebutSAPEntretien, reqBaseParam_Annee
    WHERE (((tblBaseTerr.EstGeographique)=True) AND ((tblBaseTerr.EstActif)=True))
    ORDER BY Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt], tblBaseMois.[No];


    Évidement select [ReqCalculCumul_NbEntretien].* from [ReqCalculCumul_NbEntretien]([tblBaseMois.[NoMois)) est synatxiquement faux mais c'est ce que je cherche à faire : passer le NoMois couant à ReqCalculCumul_NbEntretien pour qu'il soit utilisé comme paramètre.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  8. #8
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Dans l'exemple de requête que je t'ai donné, avec une sous-requête, il y a un exemple de passage de paramètre (mois courant) dans le critère de la sous-requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois] AS NoMoisCumul, (select Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.[prmNomois])) AS NbEntretien
    FROM reqHP_TDBEntretien
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    Dans ce critère de la sous-requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.[prmNomois]))

    reqHP_TDBEntretien.Annee désigne l'année "courante" de la requête principale reqHP_TDBEntretien et, req1.Annee l'année de la sous-requête.
    Et,
    reqHP_TDBEntretien.[prmNomois] désigne le mois "courant" de la requête principale reqHP_TDBEntretien et, req1.NoMois le mois de la sous-requête.

    grâce à l'alias req1, ça permet de passer le paramètre et de balayer tous les mois précédent reqHP_TDBEntretien.[prmNomois] dans req1.

    Je pense que tu pourrais t'inspirer de ça et l'appliquer à ta requête...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  9. #9
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Merci de l'explication.

    Dans ton exemple tout le SQL de la sous-requête est dans la requête principale.

    Si c'est possible j'aimerai garder le SQL de la sous-requête à l'extérieur or j'ai besoin que la somme ne se fasse que jusqu'à la fin du mois.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois] AS NoMoisCumul, Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    WHERE (((reqHP_TDBEntretien.NoMois)<=[prmNomois]))
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    Et je ne peux faire quelque chose comme

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    select [ReqCalculCumul_NbEntretien].* [from ReqCalculCumul_NbEntretien]
    where [ReqCalculCumul_NbEntretien].[NoMois]<=[ReqAnnee].[NoMois]

    Puisque que je ne veux pas de regroupement sur NoMois mais un cumul à la fin du dernier mois.

    Je pourrais faire quelque chose comme :

    ReqCalculCumulMens_NbEntretien

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee,  reqHP_TDBEntretien.[NoMois], Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien
    FROM reqHP_TDBEntretien
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, [prmNoMois]
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee;

    puis faire dans ma requête principale :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    (select sum([ReqCalculCumulMens_NbEntretien].[NbEntretien]) form [ReqCalculCumulMens_NbEntretien] where [ReqCalculCumulMens_NbEntretien].[NoMois]<=[reqAnnee].[NoMois]) as NbEntretien

    mais cela me paraît pas mal complexe.

    Je serai en Oracle ou en SQL Server j'irai sans scrupule mais avec l'éditeur de SQL de Access ça n'est vraiment pas tentant.
    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  10. #10
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Bonjour,

    Et si tu créais cette requête à part, disons "req_cumul_mois" :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, NoMois, (select Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.NoMois)) AS NbEntretien
    FROM reqHP_TDBEntretien
    GROUP BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, reqHP_TDBEntretien.NoMois
    ORDER BY reqHP_TDBEntretien.NoTerr, reqHP_TDBEntretien.Annee, reqHP_TDBEntretien.NoMois;

    Et qu'ensuite, tu l'utilises dans ta requête principale, un peu comme ceci :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SELECT tblBaseTerr.[No] AS NoTerr, tblBaseTerr.Desc AS DescTerr, Format([tblBaseTerr].[Index],"00") & " - " & [tblBaseTerr].[DescCourt] AS AffTerr, tblBaseTerr.EstGeographique AS EstGeographiqueTerr, req_cumul_mois.NbEntretien
    FROM tblBaseTerr inner joint req_cumul_mois on (req_cumul_mois.[NoTerr]= [tblBaseTerr].[No])  and (req_cumul_mois.[Annee]= [reqBaseParam_Annee].[Annee]) and (req_cumul_mois.[NoMois]= [tblBaseMois].[No])

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  11. #11
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Oui c'est une bonne idée même si je reste avec le
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    (select Sum(reqHP_TDBEntretien.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.NoMois))
    dans mon SQL principal, il demeure peu complexe.

    Je vais faire le test avec une seule requête et voir si j'ai un gain de temps ou de confort (actuellement je suis incapable de "voir" le résultat à l'écran dans Access).

    Je vous tiens au courant.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  12. #12
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    ok, à plus...
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  13. #13
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Bonjour.

    Les 1er tests ne sont pas très concluant en terme de vitesse. DSum() et le SQL donne grosso modo le même temps.

    Note qu'il faut faire :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select Sum(req1.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.NoMois)

    sinon cela génère une erreur d'utilisation de champ.

    Un des défauts du DSum() c'est qu'Access semble passer son temps à le recalculer pour l'afficher. Je vais voir si le SQL fait cela aussi ou pas.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  14. #14
    Rédacteur/Modérateur

    Avatar de User
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    8 260
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 8 260
    Points : 19 423
    Points
    19 423
    Billets dans le blog
    63
    Par défaut
    Je crois qu'il faut ajouter le critère (req1.NoTerr=reqHP_TDBEntretien.NoTerr) dans la sous-requête :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select Sum(req1.IndicateurNonDummy) AS NbEntretien from reqHP_TDBEntretien As req1 where (req1.NoTerr=reqHP_TDBEntretien.NoTerr) and (req1.Annee=reqHP_TDBEntretien.Annee) and (req1.NoMois<=reqHP_TDBEntretien.NoMois)

    Cdlt,
    Vous trouverez dans la FAQ, les sources ou les tutoriels, de l'information accessible au plus grand nombre, plein de bonnes choses à consulter sans modération

    Des tutoriels pour apprendre à créer des formulaires de planning dans vos applications Access :
    Gestion sur un planning des présences et des absences des employés
    Gestion des rendez-vous sur un calendrier mensuel


    Importer un fichier JSON dans une base de données Access :
    Import Fichier JSON

  15. #15
    Modérateur

    Homme Profil pro
    Inscrit en
    Octobre 2005
    Messages
    15 331
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 331
    Points : 23 786
    Points
    23 786
    Par défaut
    Oui tu as raison.

    Je vais être pas mal occupé cette semaine donc je n'aurai probablement pas le temps d'approfondir la question plus avant dans l'immédiat mais merci à tous et particulièrement à User pour votre aide.
    Je ne suis vraiment pas à l'aise avec le SQL dans du SQL.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

Discussions similaires

  1. [RegEx] remplacer AND par WHERE dans une requête SQL
    Par Kyaan dans le forum Langage
    Réponses: 2
    Dernier message: 17/07/2008, 14h42
  2. [Requête/SQL]Remplacer champ par valeur autre champ
    Par BORDEAUX4 dans le forum Requêtes et SQL.
    Réponses: 4
    Dernier message: 17/04/2007, 11h05
  3. SQL : remplacer table par requête
    Par oceanediana dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 23/08/2006, 15h18
  4. Remplacer Dlookup par une requete SQL
    Par nbouseem dans le forum IHM
    Réponses: 9
    Dernier message: 09/06/2006, 16h45
  5. Réponses: 3
    Dernier message: 23/01/2006, 12h02

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