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 :

Count distinct: non défini ? [AC-2013]


Sujet :

Requêtes et SQL.

  1. #1
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Count distinct: non défini ?
    Bonjour,

    j'ai une table (en fait une requête) dans la quelle sont enregistrés des séquences de protéines similaires (HLA-A, B et C), codées par plusieurs gènes ; plus précisément les Acides aminés (AA représenté par un code à une lettre) présents à différentes positions (le 5ème AA, 7 ème, 9ème...) pour chaque protéine (3 différentes) et chaque allèle (2 par protéine) de plusieurs personnes (identifiées par un Code_Patient).
    Je voudrais compter pour chaque personne le nombre d'AA différents à chaque position sur l'ensemble des 6 séquences protéiques...

    Code_Patient HLA Allele 5 7 9 24 34
    IG-01-001 A 1 M Y F A V
    IG-01-001 A 2 M Y S A V
    IG-01-001 B 1 M Y Y A V
    IG-01-001 B 2 M Y H T V
    IG-01-001 C 1 M Y Y A V
    IG-01-001 C 2 M Y D S V
    IG-01-002 A 1 M Y Y A V
    IG-01-002 A 2 M Y S A V
    IG-01-002 B 1 M Y Y T V
    IG-01-002 B 2 M Y H T V
    IG-01-002 C 1 M Y Y A V
    IG-01-002 C 2 M Y Y A V

    Je commence donc par un GROUP by pour regrouper les Code_Patient
    Et je mets dans SELECT un count distinct sur chaque variable représentant une position d'AA (5 ; 7 ; 9 ...)

    en vue d'obtenir le résultat suivant :

    Code_Patient DivAA_5 DivAA_7 DivAA_9 DivAA_24 DivAA_34
    IG-01-001 1 1 5 3 1
    IG-01-002 1 1 3 2 1


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT Rq_CMH1_Phe.Code_Patient, Count(distinct (Rq_CMH1_Phe.[5])) AS DivAA_5, Count(distinct (Rq_CMH1_Phe.[7])) AS DivAA_7, Count(distinct (Rq_CMH1_Phe.[9])) AS DivAA_9
    FROM Rq_CMH1_Phe
    GROUP BY Rq_CMH1_Phe.Code_Patient;

    j'obtiens le message d'erreur suivant : fonction "distinct" non définie dans l'expression
    Je sais pour l'avoir vue sur un tutoriel de ce forum que cette fonction existe en SQL (la syntaxe était un peu différente, mais produisait une "erreur de syntaxe"...) , mais peut-être n'est elle pas prise en charge par Access 2013..?
    Merci d'avance à tous ceux qui pourront m'aider à résoudre ou contourner ce problème !!

  2. #2
    Modérateur

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

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

    Autant que je sache Access est SQL 92 compatible (et n'a pas change recement) et Count Distinct ne fait pas parti de son vocabulaire.

    La meilleur facon de le faire selon moi est de faire une requete de regroupement et de faire le comptage sur cette requete.
    Et avec l'editeur de SQL vraiment basique de Access, je ne te recommande pas les requetes imbriquees non plus.
    Tu peux utiliser DCount() sur cette requete, quelque chose comme DCount("[5]", "TaRequeteRegroupement", "[Code_Patient]=""" & [Rq_CMH1_Phe].[Code_Patient] & """").
    Ou

    • Code_Patient est suppose alphanumerique.
      Si le code n'est pas un champ texte, ne pas mettre les "".
    • TaRequeteRegroupement est le nom de ta requete qui te donne les valeurs uniques.


    A+

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Points : 7
    Points
    7
    Par défaut Inutile de citer l'intégralité du message précédent.
    MERCI !

    ça veut dire qu'il faut faire une requête pour chaque colonne ? Il y en a 54... et après les regrouper dans une nouvelle table (J'envisageais de faire la même chose sur d'autres variables, donc à multiplier par 3 ou 4 !)
    Et pas d'espoir qu'une version plus récente améliore ce point selon toi
    Va me falloir beaucoup de temps ou alors je renonce à ce projet en attendant de maitriser un autre SGBD.

  4. #4
    Modérateur

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

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

    Et pas d'espoir qu'une version plus récente améliore ce point selon toi
    Non, j'ai la version 2016 et COUNT DISTINCT n'est pas dedans.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Va me falloir beaucoup de temps ou alors je renonce à ce projet en attendant de maitriser un autre SGBD.
    Tu peux aussi, perso je recommanderai MS SQL Express Edition, presque toute la puissance de MS SQL Server, le prix : 0$.
    Plus complique toute fois a maitriser et installer que Access.

    Il y en a 54
    Tu ne peux pas faire un select TesValeurs group by TesValeur from TaSource ?
    Peut-etre peux-tu repenser la facon dont tu traites tes donnees pour avoir tes valeurs en colonne plutot qu'en ligne.
    Access comme la plus part des BD prefere avoir :

    • Clef, Valeur1
    • Clef, Valeur2
    • Clef, Valeur3


    que

    • Clef, Valeur1, Valeur2, Valeur3.


    Si non, je te suggere de faire une function VBA dans ce cas, ca peut etre un peu long a l'execution mais tu n'auras a l'ecrire qu'une fois.

    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
    public function CountDistinct(prmNomChamp as string, prmCritere as string) as long
       dim result as long
       dim SQL as string
       SQL = "Select [" & prmNomChamp & "] from [Rq_CMH1_Phe]"
       SQL = SQL & " Group By [" & prmNomChamp & "]"
       dim db as dao.database:set db=current
       dim r as dao.recordset : set r=db.openrecordset(SQl, dbOpenSnapshot)
     
       if r.recordcount <> 0 then
          r.movelast 'Force le comptage des enregistrements
       end if
     
       result=r.recordcount
     
       r.close: set r=nothing
       db.close:set db=nothing
     
       CountDistinct=0
    end function
    s'utilise :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT Rq_CMH1_Phe.Code_Patient, CountDistinct("5", "[Code_Patient]=""" & [Rq_CMH1_Phe].[Code_Patient] & """") AS DivAA_5 ...
    On doit pouvoir tout faire avec du SQL au lieu du melange SQL / DAO mais cela ne me vient pas.

    Autre possibilite est d'utiliser du VBA pour creer les X requetes dont tu as besoin.
    Une fois crees, tu n'as plus qu'a les utiliser.

    Enfin derniere possibilite qui me vient, faire tes stats en Excel qui est vraiment bon a "cruncher" des donnees.
    Tu gardes Access pour la facilite a gerer des infos de qualite.
    Tu fais tes presentations, stats et calculs dans Excel en te basant sur les donnees contenues dans Access.

    A+

  5. #5
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Ta solution de créer la fonction en VBA me paraît la plus élégante et la plus efficace (elle me re-servira !!)
    Je vais voir si j'arrive à la mettre en oeuvre : j'ai l'impression que tu m'as donné toutes les info, mais j'avoue que j'ai encore jamais utilisé VBA dans Access...

    Mille merci à toi !!!!!

  6. #6
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 366
    Points : 23 834
    Points
    23 834
    Par défaut
    Je pense que oui, mais il m'arrive de faire des elypses car c'est "evident" quand tu en fait depuis 20 ans.

    N'ehsite pas a demander des details si besoin.

    A+

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Mai 2017
    Messages
    12
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Santé

    Informations forums :
    Inscription : Mai 2017
    Messages : 12
    Points : 7
    Points
    7
    Par défaut
    Bonjour,

    Je m'en sortais pas avec le code VBA... Finalement j'ai suivi ton premier conseil :

    Citation Envoyé par marot_r Voir le message
    Tu ne peux pas faire un select TesValeurs group by TesValeur from TaSource ?
    Peut-être peux-tu repenser la facon dont tu traites tes donnees pour avoir tes valeurs en colonne plutot qu'en ligne.
    Access comme la plus part des BD prefere avoir :

    • Clef, Valeur1
    • Clef, Valeur2
    • Clef, Valeur3


    que

    • Clef, Valeur1, Valeur2, Valeur3.

    J'ai repris la structure de ma table que j'ai transformée pour avoir


    Code_Patient HLA Allele Position AA
    IG-01-001 A 1 M 5 M
    IG-01-001 A 1 M 7 Y
    IG-01-001 A 1 M 9 F
    IG-01-001 A 1 M 24 A
    IG-01-001 A 2 M 5 M
    IG-01-001 A 2 M 7 Y
    IG-01-001 A 2 M 9 S
    IG-01-001 A 2 M 24 A
    IG-01-001 B 1 M 5 M
    IG-01-001 B 1 M 7 Y
    IG-01-001 B 1 M 9 Y
    IG-01-001 B 1 M 24 A

    , ce qui est sans doute plus "propre"; et me permet de faire très simplement une première requête avec GROUP BY Code_Patient, HLA, Allele, Position, AA.
    Et une seconde avec GROUP BY Code_Patient, HLA, Allele, Position et un SELECT count(AA).
    Qui me donne exactement ce que je voulais !!!

    De plus ça simplifiera d'autres requêtes que je dois faire dessus...

    MERCI encore pour ton aide.

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

Discussions similaires

  1. Erreur d'analyse XML : entité non définie
    Par ToxiZz dans le forum XML/XSL et SOAP
    Réponses: 1
    Dernier message: 16/01/2006, 13h22
  2. [SGBDR ACCES97] COUNT & DISTINCT
    Par totoche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/12/2005, 09h24
  3. fonction non définie
    Par ston dans le forum Access
    Réponses: 11
    Dernier message: 12/12/2005, 16h02
  4. [RAR] Fonction rar_open non définie
    Par laulau75 dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 11/11/2005, 12h19
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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