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 :

regroupement par dates contigues


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut regroupement par dates contigues
    Bonjour à tous,

    J'ai ce style de données:

    Matricule;date;valeur
    Par exemple: 10001;20/02/2019;0.5
    10001;21/02/2019;1
    10002;21/02/2019;1
    10002;22/02/2019;1
    10002;23/02/2019;1
    10002;24/02/2019;1
    10001;03/04/2019;1

    Et je cherche à les regrouper et sommer par dates contigues.
    Pour avoir par exemple:

    Matricule;somme de valeur; du; au
    10001; 1.5; 20/02/2019; 21/02/2019
    10002; 4; 21/02/2019; 24/02/2019
    10001; 1; 03/04/2019; 03/04/2019

    Mais je coince et je ne vois pas comment m'y prendre.

    Auriez-vous une piste ?

    Merci.

  2. #2
    Modérateur

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

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

    Requête 1 : La 1ère étape nécessaire me semble d'établir la "contiguité" en calculant la différence de jour entre une date et sa précédente.
    Requête 2 : Cela fait, tu pourrais assigner un numéro de lot composé de la date de la 1ère date et du matricule.
    Une fois cela fait, je pense qu'une bête requête de regroupement par numéro de lot basée sur Requête 2 devrait te donner les valeurs voulue.

    Pour la date précédente, il faut chercher la date maximum strictement inférieure à la date courante pour le matricule considéré.

    A+

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Septembre 2012
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Septembre 2012
    Messages : 2
    Points : 1
    Points
    1
    Par défaut
    Pour la requête 2 c'est bien ce que j'avais imaginé et prévu.

    Pour la requête 1 par contre, je bloque. Tu peux faire cela en sql ou tu passes par vba ?

  4. #4
    Modérateur

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

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

    Tu peux le faire en SQL avec la fonction DMax().

    Quelque chose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    DateDonneesPrecedente: DMax("DateDonnees"; "tblDonnees"; "[DateDonnees]<#" & format([tblDonnees].[DateDonnees]; "aaaa-mm-jj") & "# and [Matricule]=" & [tblDonnees].[Matricule])
    Après il suffit de faire la différence entre [tblDonnees].[DateDonnees] et DateDonneesPrecedente, si c'est égale à 1, c'est que c'est "contigue".

    Mais peut-être qu'en VBA ce serait plus simple.
    Il te suffit de trier les données par matricule et date et de détecter les "changements de lot" en parcourant les données.
    Si le matricule change ou si la différence entre la date courante et la date mémorisée de l'enr précédent est > 1 tu changes de lot.
    Cela suppose que tu peux ajouter un champ "NumLot" à ta table initiale ou que tu fais une copie dans une table de travail.

    Accessoirement la solution en VBA serait sans doute plus rapide que les DMax() car tu ne ferai qu'une seule "passe" pour identifier les lots.

    A+

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bonsoir,

    si moins de 500 lignes étudiées, voici une solution pure SQL, au delà la performance n'est plus là et il faut passer par du VBA.
    nom tables : Matricules
    nom colonnes : Matricule, LaDate, Valeur
    Clef primaire : Matricule+LaDate

    1ere requête à nommer rMatriculeBase
    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
     
    SELECT T.Matricule,
           Min(T.mini) AS mini,
           T.maxi      AS maxi
    FROM   (SELECT t1.Matricule,
                   t1.LaDate    AS mini,
                   Max(t2.LaDate) AS maxi
            FROM   Matricules AS T1
                   INNER JOIN matricules AS T2
                           ON ( t1.LaDate <= t2.LaDate)                          AND ( t1.Matricule = t2.Matricule )
            WHERE  (SELECT Count(*)
                    FROM   Matricules As T
                    WHERE  t.Matricule = t1.Matricule
                           AND t.LaDate BETWEEN t1.LaDate AND t2.LaDate) = (t2.LaDate - t1.LaDate + 1 )
            GROUP  BY t1.matricule,
                      t1.LaDate) AS T
    GROUP  BY T.matricule,
              T.maxi
    ORDER  BY T.matricule,
              Min(T.mini);

    Requête finale :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
     
    SELECT matricules.matricule,
           SUM(matricules.valeur) AS SommeDeValeur,
           r.mini,
           r.maxi
    FROM   matricules
           INNER JOIN rmatriculebase AS r
                   ON matricules.matricule = r.matricule
    WHERE  matricules.ladate BETWEEN [mini] AND [maxi]
    GROUP  BY matricules.matricule,
              r.mini,
              r.maxi

Discussions similaires

  1. Regroupement par date la plus récente
    Par pbt1983 dans le forum Requêtes
    Réponses: 3
    Dernier message: 22/11/2009, 20h10
  2. [AC-2003] regroupement par date
    Par martiner dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 17/11/2009, 21h11
  3. Etat regroupement Par date par jour
    Par bobosh dans le forum IHM
    Réponses: 2
    Dernier message: 01/08/2008, 09h03
  4. Regroupement par date dans une requete access
    Par ifrpi dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 08/02/2008, 03h32
  5. Réponses: 5
    Dernier message: 29/09/2004, 11h05

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