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 à partir de multiples comparaisons


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut Regroupement à partir de multiples comparaisons
    Bonjour,

    J’ai un petit blocage concernant une méthode de regroupement, et je n’ai vu (ou compris) aucune documentation ou discussion sur ce forum qui pourrait le résoudre.

    J’ai une base simple avec 3 champs :

    ID pour le comptage
    PRENOM qui peut être répété
    CODE_09 qui donne des caractéristiques pour la personne. Exemples «Yeux_verts», » Nez_long »….

    PRENOM_09-->CODE_09

    ALBERT--> YEUX_VERTS
    ALBERT--> CHEVEUX_NOIRS
    ALEX----> NEZ_LONG
    ALEX----> YEUX_VERTS
    ALEX----> CHEVEUX_NOIRS
    AUDREY-> CHEVEUX_BLONDS
    CLAIRE--> CHEVEUX_BLONDS
    CLAUDE-> NEZ_LONG
    CLAUDE-> CHEVEUX_NOIRS



    Ce que je souhaiterais obtenir, c’est isoler des groupes qui n’ont aucune caractéristique en commun.

    Dans cet exemple, il y aurait deux groupes :

    -d’un côté Albert, Alex et Claude qui ont en commun, au moins chacun de un-à-un soit les yeux (verts), les cheveux (noirs) et le nez (long) -->un regroupement « 1 » à créer

    -et de l’autre Audrey et Claire qui ont les cheveux blonds-->un regroupement « 2 » à créer

    PRENOM_09-->CODE_09------------->GROUPE

    ALBERT--> YEUX_VERTS------------>1
    ALBERT--> CHEVEUX_NOIRS--------->1
    ALEX----> NEZ_LONG--------------->1
    ALEX----> YEUX_VERTS------------->1
    ALEX----> CHEVEUX_NOIRS---------->1
    AUDREY-> CHEVEUX_BLONDS--------->2
    CLAIRE--> CHEVEUX_BLONDS--------->2
    CLAUDE-> NEZ_LONG----------------->1
    CLAUDE-> CHEVEUX_NOIRS----------->1


    Important :
    Je cherche quelque chose de plus général à cet exemple, qui peux gérer des milliers de codes.
    Pour simplifier le cas, la base n’a jamais d’interférence entre les 2 groupes : une personne du groupe « 2 » n’aura jamais les yeux verts ou le nez long.



    D’où ma question : Est il possible de générer ce regroupement via SQL qui crée les codes voulus ( base access en pj)?

    J’ai beau me creuser la tête, je ne sais pas retranscrire ces tests de comparaisons sur Access

    Merci par avance pour votre aide!

  2. #2
    Rédacteur/Modérateur

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

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

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 656
    Points : 34 370
    Points
    34 370
    Par défaut
    salut,
    je suppose que non. Tu ne peux le faire qu'a posteriori ce calcul.
    Par conter j'ai une question : comment définis-tu ton groupe origine ?
    Est-ce que cette formulation est juste : chaque groupe est constitué d'individus ayant au moins un point commun ?

    La méthode la plus "simple" serait de créer une fonction qui retourne le numéro du groupe avec un Dlookup() ou une requete avec un critere IN.

    Etudies cette piste et dis nous si tu arrives à avancer

  3. #3
    Membre émérite

    Profil pro
    Inscrit en
    Février 2005
    Messages
    1 751
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2005
    Messages : 1 751
    Points : 2 368
    Points
    2 368
    Par défaut
    Bonjour,

    Je trouve ce problème assez compliqué.
    Une simple requête SQL n'en viendra pas à bout (du moins pas avec Access, ni avec d'autres systèmes non plus ).

    Cette question a plutôt sa place dans le sous-forum Conception.

    Pour faire avancer la chose, je dirai que la solution passe sans doute par une procédure itérative (en VBA et SQL) et qu'il faut des "objets intermédiaires et finaux" nécessaires à la résolution du problème:
    - une table des groupes,
    - une table qui liste les personnes et leur n° de groupe "final",
    - une table (de travail) utilisées pour "collationner" les attributs d'une personne (yeux, nez, cheveux...) et le n° de groupe associé.
    _

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Mars 2009
    Messages
    106
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2009
    Messages : 106
    Points : 66
    Points
    66
    Par défaut
    Bonjour,

    Merci pour vos réponses. En fait j'ai eu la même idée que jpcheck ce matin et j'avais écrit dans le métro un scénario faisant intervenir 2 Dlookup. Cela semblait se tenir et puis....

    Et puis en en parlant à une collègue qui se régale bien en VBA, elle m'a proposé de me faire un petit programme, bien trop compliqué pour moi mais qui en gros catégorise les PRENOMS communs puis ensuite refait le même travail sur la nouvelle base sur les CODES. C'est un peu ce que je voulais faire avec mes Dlookup, mais cela semble bien plus stable.

    Ci dessous le script pour ceux que cela intéresse

    Cordialement

    -------------------------------------------------
    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
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
     
    Option Compare Database
    Const TableName = "BLOUB"
    Const Code = "CODE"
    Const Name = "PRENOM"
    Const GRP = "GRP"
     
     
    'Instruction: Please change the column names above before your run the program.
     
     
    Sub Test()
     
     
    Dim db As DAO.Database
    Dim rs1 As DAO.Recordset
    Dim RecordNumber As Integer
     
    Dim CodeRecord As String
    Dim NameRecord As String
    Dim SQL As String
    Dim GroupRecord As Variant
    Dim WinningGroup As Variant
     
        Set db = CurrentDb()
        Set rs1 = db.OpenRecordset(TableName, dbOpenDynaset)
     
     
     
     
    DoCmd.SetWarnings False
     
    'SQL = "UPDATE Grouping_function SET Grouping_function.GRP = Null;"
    SQL = "UPDATE " & TableName & " SET " & TableName & ".GRP = Null;"
    DoCmd.RunSQL (SQL)
     
    rs1.MoveFirst
    Do Until rs1.EOF
     
     
    CodeRecord = rs1.Fields.Item(Code)
    NameRecord = rs1.Fields.Item(Name)
     
    RecordNumber = rs1.AbsolutePosition
     
     
    GroupRecord = FindInRecordset(CodeRecord, NameRecord)
     
    If IsNull(GroupRecord) Then
    rs1.Edit
    rs1.Fields.Item("GRP") = RecordNumber
    rs1.Update
     
    Else
    rs1.Edit
    rs1.Fields.Item("GRP") = GroupRecord
    rs1.Update
    End If
     
     
    rs1.MoveNext
     
    Loop
     
    rs1.MoveFirst
    Do Until rs1.EOF
    CodeRecord = rs1.Fields.Item(Code)
    GroupRecord = rs1.Fields.Item(GRP)
     
    WinningGroup = ReviewGroup(CodeRecord, GroupRecord)
     
    rs1.MoveNext
     
    Loop
     
    DoCmd.SetWarnings True
     
    End Sub
     
    Function FindInRecordset(CodeRecord As String, NameRecord As String)
    Dim db As DAO.Database
    Dim rs2 As DAO.Recordset
     
    Set db = CurrentDb()
    Set rs2 = db.OpenRecordset(TableName, dbOpenDynaset)
     
    rs2.MoveFirst
    Do Until rs2.EOF
     
        If NameRecord = rs2.Fields.Item(Name) Then
        Group = rs2.Fields.Item(GRP)
        FindInRecordset = Group
        Exit Function
     
        End If
     
        If CodeRecord = rs2.Fields.Item(Code) And NameRecord <> rs2.Fields.Item(Name) Then
        GroupRecord = rs2.Fields.Item(GRP)
        FindInRecordset = GroupRecord
     
        Exit Function
        End If
     
    rs2.MoveNext
    Loop
     
    End Function
     
    Function ReviewGroup(CodeRecord As String, GroupRecord As Variant)
    Dim db As DAO.Database
    Dim rs3 As DAO.Recordset
     
    Set db = CurrentDb()
    Set rs3 = db.OpenRecordset(TableName, dbOpenDynaset)
     
    rs3.MoveFirst
     
    Do Until rs3.EOF
        If CodeRecord = rs3.Fields.Item(Code) Then
            If GroupRecord < rs3.Fields.Item(GRP) Then
            rs3.Edit
            rs3.Fields.Item(GRP) = GroupRecord
            rs3.Update
            ReviewGroup = GroupRecord
            Else
            GroupRecord = rs3.Fields.Item(GRP)
        End If
        End If
     
     
    rs3.MoveNext
    Loop
     
    End Function

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [AC-2010] Créer table à partir séléction multiple d'une zone de liste
    Par Brasileiro dans le forum VBA Access
    Réponses: 2
    Dernier message: 03/04/2012, 22h50
  2. [XSLT 1.0] Regrouper des champs multiples pour qu'ils soient uniques
    Par a-dawg dans le forum XSL/XSLT/XPATH
    Réponses: 9
    Dernier message: 02/03/2011, 08h08
  3. UPDATE à partir de multiple résultat
    Par junix dans le forum SQL
    Réponses: 4
    Dernier message: 18/12/2009, 11h40
  4. Réponses: 3
    Dernier message: 03/08/2005, 11h21
  5. Enregistrements multiples renvoyés à partir d'une excécution
    Par Didier100 dans le forum Bases de données
    Réponses: 2
    Dernier message: 19/07/2004, 15h25

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