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

Access Discussion :

Requête qui affiche plusieurs champs mais ne groupe que par un seul [Toutes versions]


Sujet :

Access

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut Requête qui affiche plusieurs champs mais ne groupe que par un seul
    Bonsoir/Bonjour à tous.
    J'aimerais savoir si le langage SQL en général et le SQL de Access en particulier permet de faire une requête qui affiche plusieurs champs mais ne groupe que par un seul, une requête du genre :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select Table1.Champ1, Table1.Champ2, Table1.Champ3, Table2.Champ1, Table2.Champ2
    From Table1 inner join Table2 on Table1.Champ1 = Table2.Champ2
    Group By Table1.Champ1

    Est-il possible de faire une telle requête?
    Si oui, pourrais-je avoir la syntaxe (en SQL natif de préférence).

  2. #2
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    bonsoir,

    Table1, champ1, champ2,... ça ne dit pas grand chose sur l'intention mais peut-être avec un truc comme :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT * FROM
    ( SELECT Champ1 FROM Table1 GROUP BY Champ1 ) T
    INNER JOIN Table2
    ON T.Champ1=Table2.Champ2 ;

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Si je veux avoir la liste des versements d'un élève pour le compte de sa scolarité ainsi que le total versé par exemple, j'ai un truc comme :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select elv.Matricule, elv.Nom, elv.Prenom, elv.Classe, Versement.DateVers, Versement.Montant, (Select sum(montant) from Versement where matEleve = elv.Matricule)
    From Eleve elv inner join Versement on elv.Matricule = Versement.matEleve
    Group By elv.Matricule

    (j'ai saisi cette instruction à la volée donc il y a peut-être quelques fautes )

  4. #4
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    mais dans ce cas, le GROUP BY n'est pas utile

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Oops! J'ai un peu raté la requête.
    Ca aurait dû être :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    Select elv.Matricule, elv.Nom, elv.Prenom, elv.Classe, Versement.DateVers, Versement.Montant, sum(Versement.Montant)
    From Eleve elv inner join Versement on elv.Matricule = Versement.matEleve
    Group By elv.Matricule

    Mais cette erreur met en évidence le noeud de mon problème : je suis (presqu')obligé de recourir à une sous-interrogation. J'aurai donc autant de sous-interrogations qu'il y aura de calculs portant sur les versements.
    Cette perspective est plutôt inquiétante dans la mesure où le temps d'exécution de la requête sera beaucoup plus long, surtout si on doit parcourir 1000 enregistrements dans Eleve et 5000 dans Versement ...

  6. #6
    Nouveau membre du Club
    Homme Profil pro
    Inscrit en
    Juillet 2009
    Messages
    24
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Vendée (Pays de la Loire)

    Informations professionnelles :
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juillet 2009
    Messages : 24
    Points : 38
    Points
    38
    Par défaut
    Bonjour,

    un regroupement dans un Etat Access ne ferait pas l'affaire ?

  7. #7
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    A vrai dire, je n'ai jamais utilisé les états sous Access.
    Mais eux non plus ne devraient pas beaucoup m'aider :
    je développe en utilisant l'EDI Delphi que je relie à une base de données Access. Donc quand j'exécute une requête, elle est transmise à Access qui retourne les résultats. le temps de traitement en est augmenté
    surtout si on doit parcourir 1000 enregistrements dans Eleve et 5000 dans Versement ...

  8. #8
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    D’où l’intérêt d’une solution par jointure avec la sous-requête :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT MatEleve, Sum(Montant) as TotalEleve
    FROM versement
    GROUP BY MatEleve

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT *
    FROM (Eleve elv INNER JOIN Versement ON elv.Matricule = Versement.matEleve)
    INNER JOIN SousRequete ON elv.Matricule=SousRequete.MatEleve

    C’est d’ailleurs une solution proposée par Microsoft :
    http://support.microsoft.com/kb/172199/en-us

    voir le paragraphe Nest GROUP BY Clause Before Joining
    If you are joining two tables and only grouping by fields in one of them, it may be more efficient to split the SELECT statement into two queries. making the SELECT statement with the GROUP BY clause into a nested query joined to the non-grouped table in the top-level query.

  9. #9
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Ca, c'est une sacrée solution. De prime abord, elle me semble vraiment être la meilleure pour résoudre le problème du regroupement.

    Mais une (toute petite) préoccupation subsiste :
    laquelle de ces deux requête serait la plus longue à s'exécuter pour un grand nombre de données?

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT elv.Matricule, elv.Nom, elv.Prenom, elv.Classe, Versement.DateVers, Versement.Montant,
             (SELECT sum(montant) FROM Versement WHERE matEleve = elv.Matricule),
             (SELECT count(*) FROM Versement WHERE matEleve = elv.Matricule)
    FROM Eleve elv INNER JOIN Versement ON elv.Matricule = Versement.matEleve

    ou

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT elv.Matricule, elv.Nom, elv.Prenom, elv.Classe, Versement.DateVers, Versement.Montant, sommeVersement, nombreVersement
    FROM (Eleve elv INNER JOIN Versement ON elv.Matricule = Versement.matEleve)
      INNER JOIN (Select matEleve, sum(montant) as sommeVersement, count(matEleve) as nombreVersement from Versement Group By matEleve)

  10. #10
    Responsable Arduino et Systèmes Embarqués


    Avatar de f-leb
    Homme Profil pro
    Enseignant
    Inscrit en
    Janvier 2009
    Messages
    12 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Janvier 2009
    Messages : 12 617
    Points : 56 722
    Points
    56 722
    Billets dans le blog
    40
    Par défaut
    d'après Microsoft, la 2ème solution est meilleure et ça me semble logique.

    Également d'après Microsoft (voir le paragraphe qui suit juste "Nest GROUP BY Clause Before Joining"), on peut améliorer encore en indexant la clé étangère Versement.MatEleve.

    à vérifier sur le terrain...

  11. #11
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Mars 2012
    Messages
    91
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mars 2012
    Messages : 91
    Points : 64
    Points
    64
    Par défaut
    Je crois aussi que c'est le plus convenable.
    Merci pour cette aide.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 29/11/2013, 16h54
  2. Afficher plusieurs champs dans une listbox
    Par fabien.benard dans le forum IHM
    Réponses: 2
    Dernier message: 14/11/2006, 16h37
  3. requête max sur plusieurs champs
    Par logica dans le forum Access
    Réponses: 3
    Dernier message: 28/03/2006, 16h31
  4. Réponses: 4
    Dernier message: 17/10/2005, 15h05
  5. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07

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