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 :

Compter le nombre de dates différentes (entrées parfois multiples)


Sujet :

Requêtes et SQL.

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut Compter le nombre de dates différentes (entrées parfois multiples)
    Compter le nombre de dates différentes (entrées parfois multiples)

    Bonjour à tous,

    Je cherche à compter le nombre total de visites différentes effectuées chez des patients. Pour chaque visite, j'encode une date pour l'acte effectué. Ainsi, si je vois Paule aujourd'hui et que je lui fais un Vaccin1 et un Frottis, j'encode la date du jour dans le champ Vaccin1 et dans le champ Frottis.

    Ma table intitulée MEDICAL ressemble à ceci :

    Patient+++vaccin1++++vaccin2++++vaccin3+++frottis
    Marie_____date1______date2______date3_____date1
    Jeanne_________________________date1
    Jeanne____date1__________________________date2

    Comme vous le constatez, chez Marie, il y a 4 dates encodées, mais seulement trois dates distinctes, donc je suis passé 3 fois chez elle.
    Chez Jeanne, il y a deux dates différentes (réparties sur deux enregistrements), donc je suis passé 2 fois chez elle.
    Je veux donc calculer un total de 5 visites différentes pour la table MEDICAL montrée ici.
    (En réalité, il y a une quinzaine de champs pouvant contenir des dates, semblables ou différentes… Je peux envoyer la base à qui accepte de se pencher sur mon problème)

    Je précise que je dois faire ce compte seulement une fois par an. Ce n'est donc pas un problème si, par exemple, il faut passer par une somme manuelle, pour autant que, patient par patient, y compris ceux qui sont répartis sur deux enregistrements, le nombre de visites soit calculé par une requête ou par tout autre moyen.

    Un tout grand merci d’avance pour votre aide.

  2. #2
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Par défaut
    Bonjour,

    OK pour examiner !

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Par défaut
    Voici le résultat de l'auscultation.

    On crée une nouvelle table :



    et on aura besoin d’une requête pour afficher les résultats :



    Voici le code de la fonction :

    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
    Option Compare Database
    Option Explicit
     
     
    Public Sub NbreVisites()
      Dim rs As DAO.Recordset
      Dim i As Integer
      Dim sSql As String
      DoCmd.SetWarnings False
      'Vidanger tResult (données de l'exécution précédente)
      DoCmd.RunSQL "DELETE id FROM tResultDetail;"
      'Créer un recordset de la table MEDICAL
      Set rs = CurrentDb.OpenRecordset("MEDICAL")
      'On lit enregistrement après enregistrement
      Do Until rs.EOF
        'On explore chaque champ
        For i = 0 To rs.Fields.Count - 1
           If IsDate(rs(i)) Then  's'il contient une date
               'on crée un enregistrement dans la table tResultDetail
               sSql = "INSERT INTO tResultDetail ( Patient, Datej ) SELECT """ _
                         & rs("codep") & """ AS Expr1, #" & Format(rs(i), "mm/dd/yy") & "# AS Expr2;"
               DoCmd.RunSQL sSql
           End If
        Next i
        rs.MoveNext
      Loop
      rs.Close
      Set rs = Nothing
      DoCmd.SetWarnings True
      'On affiche la récap par année
      DoCmd.OpenQuery "rSynthese"
    End Sub
    et on obtient ceci :



    La DB qui m'a servi de test est ici.
    Images attachées Images attachées  

  4. #4
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut MAGNIFIQUE !!!!!!!!!!!!!
    Avec mes plus vibrants remerciements pour ce travail d'artiste.
    Il me reste désormais à faire l'autopsie in vivo de cette belle mécanique pour en détailler les organes.
    J'étais loin d'imaginer une telle automatisation possible.
    Un tout, tout, tout grand merci.
    Je venais tout juste de créer une nouvelle table pour recueillir toutes les dates par enregistrements et en éliminer les doublons. Et j'en étais à chercher un moyen de mélanger les dates des enregistrement doubles ou triples ou quadruples (ou...) pour à nouveau éliminer les doublons et ensuite établir un décompte d'occurrence différente par ligne et sommer ces résultats.
    Je me réjouis de comprendre votre méthode.
    Mille mercis !!!

  5. #5
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 596
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 80
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 596
    Par défaut
    Bonjour Docteur,

    La version proposée livre un résultat correct, mais à la réflexion on peut concevoir une approche plus rationnelle.
    Dans la version précédente, on explore chaque cellule de table et si cette cellule contient une date, on exécute une requête : quelque 7703 fois dans notre exemple.
    La nouvelle version est plus rationnelle : on examine le type de chaque colonne de la table. Si c’est un type « date », on exécute une requête qui traite d’un coup toutes les cellules valides de cette colonne. Soit dans notre cas 14 exécutions au lieu de 7703 !
    La différence est perceptible, avec cette nouvelle version, le résultat est instantané.
    Vous me direz sans doute que gagner deux secondes par année changera peu au volume de vos charges administratives, mais je voulais m’éviter une carte jaune si l’un des arbitres du forum passait par là.
    Voici la nouvelle sub :
    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
    Public Sub NbreVisitesRevu()
      Dim rs As DAO.Recordset
      Dim i As Integer
      Dim sSql As String
      DoCmd.SetWarnings False
      'Vidanger tResult (données de l'exécution précédente)
      DoCmd.RunSQL "DELETE id FROM tResultDetail;"
      'Créer un recordset de la table MEDICAL
      Set rs = CurrentDb.OpenRecordset("MEDICAL")
        'On explore chaque champ pour déterminer s'il s'agit d'une date
        For i = 0 To rs.Fields.Count - 1
            If rs(i).Type = 8 Then    'c.-à-d. une date
               'on crée une requête pour traiter toutes les dates valides de cette colonne
               sSql = "INSERT INTO tResultDetail ( Patient, Datej )" _
                      & " SELECT CODEP,  format([" & rs(i).Name & "],""mm/dd/yy"") As Expr " _
                      & " FROM MEDICAL WHERE IsDate(" & rs(i).Name & ")=-1;"
               DoCmd.RunSQL sSql
            End If
        Next i
      rs.Close
      Set rs = Nothing
      DoCmd.SetWarnings True
      'On affiche la récap par année
      DoCmd.OpenQuery "rSynthese"
    End Sub
    Au plaisir de vous recroiser.

  6. #6
    Candidat au Club
    Homme Profil pro
    Médecin
    Inscrit en
    Janvier 2014
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Médecin
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2014
    Messages : 3
    Par défaut
    J'admire votre amour du beau code.
    Petit biais toutefois, car il me semble avoir compris les arcanes de votre méthode : vous n'éliminez pas les dates doublons pour un même CODEP, tout du moins lorsque qu'un même CODEP se trouve sur plusieurs lignes. Or il y en a beaucoup. Par exemple le premier enregistrement de A00003 a un 4/08/2011 dans le champ RemisePriseSangContrôle et a la même date dans le deuxième enregistrement dans le champ DateFrottisDeColHPV. Votre méthode la compte pour deux visites. Or, une même date dans plusieurs champs pour un même CODEP = 1 visite seulement.
    Avec ma méthode manuelle à l'emporte pièce, je compte, pour 2013, 1812 visites.
    Cela fait-il sens ou bien me trompe-je ?

Discussions similaires

  1. [XL-2007] Compter le nombres de cellules différentes d'une colonne en fonction de date
    Par lorin.maxime dans le forum Macros et VBA Excel
    Réponses: 4
    Dernier message: 09/09/2013, 11h31
  2. Compter le nombre d'article différent pour une date X
    Par Raphael1980 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 03/02/2012, 10h32
  3. Compter le nombre de jours écoulés entre deux dates
    Par koKoTis dans le forum VBScript
    Réponses: 8
    Dernier message: 07/08/2006, 19h44
  4. Réponses: 2
    Dernier message: 28/04/2006, 13h28
  5. Réponses: 9
    Dernier message: 10/08/2004, 17h13

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