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 :

Transformer colonne en ligne


Sujet :

Requêtes et SQL.

  1. #1
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 38
    Points
    38
    Par défaut Transformer colonne en ligne
    Bonjour tout le monde,

    Je travaille sur access 2000.

    J'ai 3 tables dans ma base de données
    1. Réunions : ID_Réunion, Date, Thème, Type de réunion
    2. Personne : ID_Personne, Nom, Prénom
    3. Personne présente à une réunion : ID_Réunion, ID_Personne


    j'ai fait une requête SQL qui m'affiche les réunions avec les personnes qui y ont assisté.

    Je veux maintenant faire un combobox dans lequel je choisirai une valeur à partir de la liste et cliquer sur un bouton pour générer le rapport de la réunion. Les valeurs de la combobox seront les noms des personnes qui ont assisté à la réunion. Ce qui revient à transformer la requête précédente en une requête qui génère deux champs : un champ ID_Réunion, et un champ composé des noms des personnes ayant assisté à la réunion. C'est à dire

    Si

    x1,y1 et z1 étaient présentes à la réunion 1,

    et

    x2,y2,z2,m2,r2 ont assisté à la réunion 2

    et

    y3,z3 ont assisté à la réunion 3


    le résultat de ma requête serait quelque chose comme :

    1 | x1, y1, z1
    2 | x2, y2, z2, m2, r2
    3 | y3, z3


    et non pas

    1 | x1
    1 | y1
    1 | z1
    2 | x2
    2 | y2
    2 | z2
    2 | m2
    2 | r2
    3 | y3
    3 | z3


    Je sais qu'il faut passer par des crosstab queries, mais là je bloque vraiment. Je ne sais veraiment pas comment faire.

    Si quelqu'un a une solution à mon problème, son aide me serait précieuse.

  2. #2
    Membre chevronné Avatar de Renardo
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    1 648
    Détails du profil
    Informations personnelles :
    Âge : 61
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 1 648
    Points : 2 019
    Points
    2 019
    Par défaut
    Je pense que concaténation devrait résoudre ton problème
    regarde ici
    http://access.developpez.com/sources...QLLigneColonne

  3. #3
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Bonsoir,


    Je ne crois pas une requête analyse croisée soit la solution. En effet, en rusant un peu, tu devriais pouvoir obtenir un résultat de ce genre:

    x1 y1 z1 x2 y2 z2 m2 r2 x3 y3 z3
    1 x1 y1 z1
    2 x2 y2 z2 m2 r2
    3 x3 y3 z3

    mais cela représenterait un nombre variable de colonnes, inadapté pour ta combobox.

    Il faut je pense créer l'information dans un seul champ par réunion, en concaténant la liste des nom des participant.

    Pour faire cela, tu fais une fonction en VBA du genre (non testée)

    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
    Function apListeParticipants(IDRéunion as Long) as string
    On error resume next
    Dim orst as DAO.Recordset
    dim s as string
     
    set orst = currentdb.Openrecordset("SELECT tP.Nom, tP.Prénom " _
       & " FROM Personne as tP INNER JOIN [Personne présente à une réunion] as tPP ON tP.IDPersonne = tPP.IDPersonne " _
       & " WHERE tPP.IDRéunion = " & IDRéunion)
     
    While not orst.EOF
       s = s & ", " & orst!Nom & " " & orst!Prénom
      orst.movenext
    WEND
    if len(s)>0 then apListeParticipants = mid(s;3)
     
    orst.Close: Set orst= nothing
    End function

    Il te reste alors simplement à appeler ta fonction en SQL
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT IDRéunion, apListeParticipants(IDRéunion) as Participants FROMunion


    Attention aux performances, cette solution risque d'être assez lente si tu as bcp de lignes dans ta combo...

  4. #4
    Membre expert
    Avatar de mout1234
    Profil pro
    Inscrit en
    Novembre 2006
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Âge : 55
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Novembre 2006
    Messages : 2 210
    Points : 3 228
    Points
    3 228
    Par défaut
    Citation Envoyé par Renardo Voir le message
    Je pense que concaténation devrait résoudre ton problème
    regarde ici
    http://access.developpez.com/sources...QLLigneColonne
    Argh, merci Renardo, je savais que j'ai déjà vu qq chose dans le genre dans les sources mais ... je ne l'avais pas retrouvé !

  5. #5
    Expert confirmé
    Avatar de vodiem
    Homme Profil pro
    Vivre
    Inscrit en
    Avril 2006
    Messages
    2 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Vivre
    Secteur : Conseil

    Informations forums :
    Inscription : Avril 2006
    Messages : 2 895
    Points : 4 325
    Points
    4 325
    Par défaut
    salut à tous,

    il est encore possible si tu te fixe une limite au nombre de personne participant à une réunion de faire la concaténation de ces personnes dans un champ dans une seule requete.
    mais je me demande si c'est bien pratique? parce que mettre plus de trois noms complets dans une combo cela oblige soit d'élargir le combo de facon exésif soit avoir dans la liste qu'une visu partiel du groupe.
    je te recommande plutot une combo pour le choix de la réunion et une zone de liste pour les personnes ayant participé.


  6. #6
    Nouveau membre du Club
    Inscrit en
    Août 2006
    Messages
    79
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 79
    Points : 38
    Points
    38
    Par défaut
    Merci à vous tous, votre solution marche à merveille.

    Voilà comment j'ai fait :

    J'ai commencé tout d'abord par ma petite fonction que j'ai essayé de faire en dynamique :

    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
     
    Public Function Concatenation(Table As String, ChampAConcatener As String, ChampDeCondition, Condition As Long) As String
        Dim res As DAO.Recordset
        Dim SQL As String
     
        On Error Resume Next
     
        SQL = "SELECT " & ChampAConcatener & " FROM " & Table & " WHERE " & ChampDeCondition & " = " & Condition
     
        Set res = CurrentDb.OpenRecordset(SQL)
     
     
        While Not res.EOF
            Concatenation = Concatenation & res.Fields(0).Value & " - "
            res.MoveNext
        Wend
     
        Concatenation = Left(Concatenation, Len(Concatenation) - 3)
        Set res = Nothing
    End Function
    J'ai créé une requête toute simple appelé "Vrac" qui me sort les personnes présentes en vrac :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT Réunion.ID, Personne.Nom + " " + Personne.Prénom as Personne FROM Réunion INNER JOIN (Personnes INNER JOIN [Personnes présentes à une réunion] ON Personne.ID = [Personne présentes à une réunion].ID_Personne) ON Réunion.ID = [Personne présentes à une réunion].ID_Réunion;
    Et finalement j'ai créé une deuxième requête de la manière suivante :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    SELECT DISTINCT ID, Concatenation("Vrac","Personne","ID",ID) as [Personnes présentes] From [Vrac];
    Merci encore et bonne journée

  7. #7
    Futur Membre du Club
    Femme Profil pro
    Ingénieur commercial
    Inscrit en
    Février 2016
    Messages
    27
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur commercial
    Secteur : Industrie Pharmaceutique

    Informations forums :
    Inscription : Février 2016
    Messages : 27
    Points : 8
    Points
    8
    Par défaut Requete - Access
    Bonjour,

    Je besoin bcp de votre aide;

    J'ai cette table dans le programme Access:

    Nom : Capture.JPG
Affichages : 1930
Taille : 55,0 Ko

    J'ai besoin que toutes les colonnes se regroupe en une seule, comment on peux voir ci-dessous:

    Nom : Capture2.JPG
Affichages : 1934
Taille : 56,9 Ko

    Merci d'avance,
    Ingrid

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

Discussions similaires

  1. [Toutes versions] Transform Colonne en ligne
    Par DonKnacki dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 24/08/2012, 13h31
  2. Transformer colonne en ligne
    Par ghizlanebenkirane dans le forum Excel
    Réponses: 4
    Dernier message: 19/08/2011, 16h58
  3. transformer colonne en ligne
    Par tomanu dans le forum SQL
    Réponses: 5
    Dernier message: 06/10/2010, 09h15
  4. [Excel2003] transformation colonnes en lignes
    Par le_viet dans le forum Excel
    Réponses: 2
    Dernier message: 14/05/2007, 11h49
  5. [VBA-E]Transformer colonne en ligne
    Par amd64 dans le forum Macros et VBA Excel
    Réponses: 3
    Dernier message: 23/03/2006, 14h48

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