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 :

Requête pour agrégation de plusieurs champs d'une table [AC-2013]


Sujet :

Requêtes et SQL.

  1. #1
    Membre à l'essai
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Septembre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 73
    Points : 20
    Points
    20
    Par défaut Requête pour agrégation de plusieurs champs d'une table
    Bonjour à tous,

    Premièrement, je pense que mon pb peut être résolu à l'aide d'une requête en SQL mais peut être qu'un gros code VBA bien bourrin est plus approprié.

    Je vous explique mon pb :

    J'ai une table : t_seance

    A titre d'exemple, elle contient de nombreux champs dont :

    - Num_Auto (PK)
    - Nom_1
    - Nom_2
    - Nom_3
    -Temps_1
    -Temps_2
    -Temps_3
    -N_client

    Pour les besoins d'une sortie particulière pour la comptabilité, j'aurai besoin d'avoir une requête qui deviendrait :

    - Num_Auto (PK)
    - Nom (reprénant séparément les valeurs des trois champs Nom_1, Nom_2 et Nom_3)
    -Temps (reprenant séparément les valeurs des 3 champ Temps_1, Temps_2 et Temps_3)
    -N_client

    En sachant que le Champ Temps_1 correspond au Nom_1 etc. et qu'il faudrait également répéter le N_Client pour chaque ligne agrégée. Biensur je ne veux pas me contenter d'une concatenation des caractère dans la colonne commune, je veux vraiment un nouvel enregistrement pour chaque Nom. Par ailleurs il y aura des doublons dans le champ "Nom" et je souhaite également les conserver.

    Je suis dans le flou le plus complet sur comment arriver à ça. J'ai essayé quelque recherche sur internet mais sans succès. Je ne vois pas par ou commencer : dois je passer par une requête ? requête de regroupement ? de jointure ? d'analyse croisée ???

    Ou alors il faut passer par la case VBA ?

    Merci d'avance pour votre aide ou vos pistes de réflexion.

    Bonne soirée

  2. #2
    Modérateur

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

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

    Pour répondre strictement à ta question, une requête UNION et 3 requêtes est une solution :

    R1 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select  [TaTable].[Nom_1] as [nom],  [TaTable].[Temps_1] as [temps],  [TaTable].[N_client] from [TaTable]
    R2 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select  [TaTable].[Nom_2] as [nom],  [TaTable].[Temps_2] as [temps],  [TaTable].[N_client] from [TaTable]
    R3 :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select  [TaTable].[Nom_3] as [nom],  [TaTable].[Temps_3] as [temps],  [TaTable].[N_client] from [TaTable]

    RU :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [r1].* form [r1]
    union all [r2].* form [r2]
    union all [r3].* form [r3]

    Note la requête union doit être tapé directement en SQL.
    Le all est important pour être sûr de conserver TOUS les enregistrements.

    Maintenant, la structure recommandée pour des données de ce type est quelque chose comme :

    tblTempsPersonne
    ClefTempsPersonne
    ClefClient
    ClefPersonne (pas le nom car tu peux avoir des homonymes)
    NumTemps
    Temps

    Avec cette structure tu peux avoir autant de temps par personne que tu veux sans limitation.
    Pas besoin de changer les écrans de saisie si tu veux un 4ième ou 5ième temps.
    Tu peux TRÈS facilement sortir les temps des au lieu de faire 4 requêtes pour y arriver.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select tblTempsPersonne.* from tblTempsPersonne

    Le seul désavantage c'est que cela ne permet pas de saisie en tableau où tu peux entrer les 3 temps en une seule ligne. Il faut faire autant de ligne que tu de temps.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  3. #3
    Membre à l'essai
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Septembre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 73
    Points : 20
    Points
    20
    Par défaut
    Bonjour,

    Merci beaucoup pour ta réponse. Ca pas l'air mal que tu proposes, j'essaie ca ce soir. Je ne suis vraiment pas à l'aise avec les requête et le langage SQL mais ça reste simple la.

    Pour en revenir a la structure de ma table qui peux paraitre un peu bancale, je souhaitais vraiment avoir un enregistrement unique par séance et non répéter les enregistrement pour chaque personnes de chaque séance. C'est une raison principalement esthétique et pratique pour la saisie des données dans mes formulaires comme tu l'as fait remarquer mais qui correspond également à une réalité pratique, sans trop vouloir rentrer dans le détail. Les personnes ne sont pas identifiée par un "nom" mais bien par un numéro d'identifiant généré automatiquement dans une autre table. C'est vrai que mon exemple le laisse penser

    Merci pour tes suggestions complémentaire ceci dit.

    Bonne soirée

  4. #4
    Membre à l'essai
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Septembre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 73
    Points : 20
    Points
    20
    Par défaut
    Je vous confirme que la méthode fonctionne bien. Je n'ai pas bien compris la syntaxe postée pour la requête union. Est-il possible de faire appelle uniquement a chaque requête de sélection (à quoi correspondent le "." et "*" ?) ? Pour ma part j'ai copié collé les instructions sql de chaque requête de sélection suivi de UNION all pour construire ma requête union. Du coup, dans les faits, mes requêtes de sélection ne servent pas vraiment, d'ou mon interrogation sur la syntaxe postée et la possibilité de faire directement appel en SQL aux requetes de sélection crées ?

    En tout cas merci car mon problème est résolu.

    Bonne journée

  5. #5
    Modérateur

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

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

    Oui on peut faire une seule requête union qui contient tous les SQL mais personnellement je trouve cela plus difficile à maintenir et à mettre au point.
    Si un morceau ne fonctionne pas, toutes la requête ne fonctionne pas.
    De plus l'éditeur de SQL de Access est assez médiocre et n'aide pas vraiment.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [r1].* from [r1]
    union all [r2].* from [r2]
    union all [r3].* from [r3]

    Désolé il y avait un faute dans le code. J'avais tapé foRm au lieu de fRom.

    La syntaxe

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    select [r1].* from r1

    Peut être simplifiée en


    Mais si tu mets ce SQL dans l'éditeur de requête de Access, Access ne "voit" pas les tables quand tu passes en mode d'affichage "Conception" et personnellement je préfère grandement le mode conception à l'indigence de l'éditeur de SQL.

    le [r1]. indique de quelle table ou requête provient le champ. C'est surtout utile quand tu as une requête avec plusieurs tables qui comporte de nombreux champs. Tu sais instantanément d'où provient le champ que tu regardes.
    Accessoirement c'est aussi ce que Access fait généralement dans le SQL qu'il génère.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

  6. #6
    Membre à l'essai
    Homme Profil pro
    Ingénieur environnement
    Inscrit en
    Septembre 2014
    Messages
    73
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur environnement
    Secteur : Santé

    Informations forums :
    Inscription : Septembre 2014
    Messages : 73
    Points : 20
    Points
    20
    Par défaut
    J'avais corrigé tout seul pour le from mais j'avais un message d'erreur malgré tout. Peut-être un peu fatigué quand j'ai fait ça hier soir dans ce cas.
    Merci pour ces précisions !

  7. #7
    Modérateur

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

    Informations forums :
    Inscription : Octobre 2005
    Messages : 15 323
    Points : 23 758
    Points
    23 758
    Par défaut
    Bon voici la bonne syntaxe.

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select [r1].* from [r1]
    union all select [r2].* from [r2]
    union all select [r3].* from [r3]

    Apparemment j'étais fatigué aussi.

    A+
    Vous voulez une réponse rapide et efficace à vos questions téchniques ?
    Ne les posez pas en message privé mais dans le forum, vous bénéficiez ainsi de la compétence et de la disponibilité de tous les contributeurs.
    Et aussi regardez dans la FAQ Access et les Tutoriaux Access. C'est plein de bonnes choses.

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

Discussions similaires

  1. [AC-2003] Requête mise à jour d'un champ d'une Table dans plusieurs bases ACCESS
    Par alainfbsi dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 02/05/2013, 21h35
  2. [MySQL] Extraire plusieurs champs d'une table dans une même requête
    Par la_chouette dans le forum PHP & Base de données
    Réponses: 15
    Dernier message: 28/11/2012, 12h11
  3. [AC-2007] Concaténer plusieurs champs d'une table dans une requête avec format date
    Par MelaAllIn dans le forum Requêtes et SQL.
    Réponses: 6
    Dernier message: 25/08/2011, 11h05
  4. Réponses: 7
    Dernier message: 18/03/2011, 16h09
  5. Requête a/ recherche dans plusieurs champs de la table
    Par 810mcu dans le forum Langage SQL
    Réponses: 3
    Dernier message: 25/11/2007, 21h05

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