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: Rassembler les informations de plusieurs lignes en une seule [AC-2010]


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut Requête: Rassembler les informations de plusieurs lignes en une seule
    Bonjour,

    J’ai une base constituée de 5 tables liées comme dans la (miniature 1).

    J’ai créé une requête qui me donne pour chaque voyageur, les hôtels qu’il a pris ainsi que le détail de son vol (voir miniature 2).

    Etant donné que cette requête est destinée à être exploitée par une application externe, il faut qu’il y ait une seule ligne d’informations par voyageur, c’est-à-dire :

    Au lieu d’avoir
    Voyageur 1 | hotel 1 | no vol 1
    Voyageur 1 | hotel 1 | no vol 2
    Voyageur 1 | hotel 1 | no vol 3
    Voyageur 1 | hotel 1 | no vol 4
    Voyageur 1 | hotel 2 | no vol 1
    Voyageur 1 | hotel 2 | no vol 2
    Voyageur 1 | hotel 2 | no vol 3
    Voyageur 1 | hotel 2 | no vol 4

    J’aurai_____________
    Voyageur 1 | hotel 1, hotel 2 | no vol 1, no vol 2, no vol 3, no vol 4

    Comment y parvenir ?

    Merci d’avance
    Images attachées Images attachées   

  2. #2
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Albayt bonsoir,

    Solution utiliser transform et pivot dans ta requête

    Bonne soirée

    JimBolion

  3. #3
    Expert éminent
    Avatar de jimbolion
    Homme Profil pro
    Moulticien
    Inscrit en
    Janvier 2013
    Messages
    3 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Moulticien
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2013
    Messages : 3 150
    Points : 7 001
    Points
    7 001
    Billets dans le blog
    2
    Par défaut
    Albayt,

    et cette discussion ou Robert fait encore étalage de ses compétences :

    http://www.developpez.net/forums/d13...ire-reporting/

    @++

    JimboLion

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bonsoir,

    Merci pour votre réponse. Toutefois, il me semble que le PIVOT n'est pas adapté à mon cas.

    En fait, je ne souhaite pas avoir comme résultat de la requête

    Voyageur | Hotel 1 | Hotel 2 | Hotel 3

    Je veux un résultat concaténé par voyageur

    Voyageur | Hotels
    Dupond | Dubai premiere, Abu dhabi beach, etc.

    Pourriez-vous m'expliquer comment dois-je procéder ?
    Merci

  5. #5
    Membre expert
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Octobre 2012
    Messages
    1 873
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Canada

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Service public

    Informations forums :
    Inscription : Octobre 2012
    Messages : 1 873
    Points : 3 459
    Points
    3 459
    Par défaut
    Bonjour albayt, Jean-Marie,

    Merci Jean-Marie. Désolé albayt je ne vois pas comment c'est possible dans une requête. De toute évidence la requête que tu as fait te donne des doublons. De plus il n'y aura jamais le même nombre de champs (un voyage avec une escale/un voyage avec trois escales).

    Ce que je vois qui pourrait faire ton bonheur est de créer une nouvelle table dans laquelle tu insérerais les données sous la forme que tu veux. La clé de cette table serait "RefVoyage" + "RefClient".
    RefVoyage/clé composée-numérique
    RefClient/clé composée-numérique
    NomVoyageur/Texte/
    Hotel/Texte
    Vol/Texte

    Tu peuples cette table à l'aide de code dans un formulaire de ton application qui peut te fournir la clé RefVoyage et RefClient. Disons un bouton btnRemplirTable. Avec le code:
    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
    Private Sub btnRemplirTable_Click()
     
        Dim db As DAO.Database: Set db = CurrentDb
        Dim rst As DAO.Recordset
        Dim strSQL As String, strNomClient As String, strHotel As String, strVol As String
        strHotel = ""
        strVol = ""
        'Récupérer le nom et le prénom
        strSQL = "SELECT Clients.Nom, Clients.Prenom FROM Voyages INNER JOIN (Clients INNER JOIN Inscriptions ON Clients.RefClt = Inscriptions.RefClt) ON Voyages.RefVoyage = Inscriptions.RefPack " _
        & "WHERE (((Clients.RefClt)=" & Me.RefClient & ") AND ((Voyages.RefVoyage)=" & Me.RefVoyage & "));"
        Set rst = db.OpenRecordset(strSQL)
        If rst.EOF = False Then
            strNomClient = rst("Nom") & " " & rst("Prenom")
        Else
            'Ici tu pourrais mettre un message d'erreur disant que le client n'est pas trouvé
            rst.Close
            Set rst = Nothing
            Set db = Nothing
            Exit Sub
        End If
        rst.Close
        Set rst = Nothing
        'Récupérer les hotels et concaténer
        strSQL = "SELECT Hebergement.Hotel FROM Hebergement WHERE (((Hebergement.RefVoyage)=" & Me.RefVoyage & "));"
        Set rst = db.OpenRecordset(strSQL)
        While rst.EOF = False
            If strHotel = "" Then
                strHotel = rst("Hotel")
            Else
                strHotel = strHotel & ", " & rst("Hotel")
            End If
            rst.MoveNext
        Wend
        rst.Close
        Set rst = Nothing
        'Récupérer les vols et concaténer
        strSQL = "SELECT Vols.noVol FROM Vols WHERE (((Vols.RefVoyage)=" & Me.RefVoyage & "));"
        Set rst = db.OpenRecordset(strSQL)
        While rst.EOF = False
            If strVol = "" Then
                strVol = rst("noVol")
            Else
                strVol = strVol & ", " & rst("noVol")
            End If
            rst.MoveNext
        Wend
        rst.Close
        Set rst = Nothing
        Set db = Nothing
        'Ici on enregistre dans la table
        strSQL = "INSERT INTO TaTable (RefVoyage, RefClient, NomVoyageur, Hotel, Vol) " _
        & "VALUES (" & Me.RefVoyage & ", " & Me.RefClient & ", " & strNomClient & ", " & strHotel & ", " & strVol & ");)"
        DoCmd.RunSQL strSQL
     
    End Sub
    Si tu veux peupler ta table par voyage, il faudrait faire une boucle de plus sur les clients associés à ce voyage.

    J'espère que ça peut t'aider même si ce n'est pas exactement ce que tu souhaitais.

    Bonne journée

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Merci beaucoup Robert pour ton temps,

    Je pense qu'il y a moyen de parvenir à une solution avec les analyses croisées "Pivot" et ce, en allant par étape mais à condition de pouvoir "concatener" des champs dans les requêtes croisées chose que je n'ai pas su faire.

    Comment faire pour concatener les valeurs d'une requête croisée dans un seul champ (voir miniature) ?

    Merci
    Images attachées Images attachées  

  7. #7
    Membre du Club
    Homme Profil pro
    Inscrit en
    Octobre 2013
    Messages
    61
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Octobre 2013
    Messages : 61
    Points : 43
    Points
    43
    Par défaut
    Bonsoir tout le monde,

    J'ai trouvé la solution qui répond 100% au besoin sans aucun bricolage dans un tuto sur le forum intitulé "Les meilleures sources Access".

    Tous les détails sont ici sous le titre Concaténer plusieurs enregistrements dans une seule colonne

    C'est vraiment merveilleux!

    Merci à vous

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

Discussions similaires

  1. Insérer plusieurs lignes avec une seule requête
    Par kyuuse1 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 13/06/2013, 09h06
  2. [DATA] Réunir information sur plusieures lignes en une seule ligne
    Par philippeadp dans le forum SAS Base
    Réponses: 1
    Dernier message: 25/10/2011, 16h03
  3. Concaténer les champs de plusieurs lignes en un seul
    Par gvdmoort dans le forum SQL Procédural
    Réponses: 3
    Dernier message: 07/09/2007, 12h01
  4. [MySQL] Checkboxes : récupérer les informations sur plusieurs lignes
    Par eric41 dans le forum PHP & Base de données
    Réponses: 14
    Dernier message: 12/06/2006, 12h41
  5. Concatenation de plusieurs lignes en une seule
    Par stawen dans le forum Langage SQL
    Réponses: 2
    Dernier message: 31/03/2005, 13h55

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