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 :

Transposer des lignes en colonnes


Sujet :

Requêtes et SQL.

  1. #1
    Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 88
    Points : 60
    Points
    60
    Par défaut Transposer des lignes en colonnes
    Bonjour,

    J'ai un petit souci.
    J'ai une BdD avec une table SOCIETE, dans laquelle j'ai des informations générales relatives à chaque société, et une table SOCIETE_CONTACTS, dans laquelle je rentre l'ensemble des contacts liés à chaque société. Cette table a une clé composite (Code_Societé + Code_Contact), j'ai donc, pour chaque société, autant de lignes que j'ai de contacts.
    Dans l'optique de faire un extract Excel, je voudrais créer une requête dans laquelle je trouverais sur la même ligne le nom de ma société ainsi que l'ensemble des contacts pour cette société (contact 1 dans la colonne 1, contact 2 dans la colonne 2, etc.)
    J'ai cherché dans les tuto, mais je dois mal m'y prendre... J'ai aussi essayé de le faire avec une requête analyse croisée, mais là encore, je ne dois pas faire les choses comme il faut.

    Si quelqu'un a déjà eu ce genre de problème et a trouvé une solution, je suis preneuse !

    D'avance merci pour votre aide.

    MelaAllIn

  2. #2
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 088
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 088
    Points : 5 204
    Points
    5 204
    Par défaut
    Bonjour,

    Je ne pense pas que ce soit possible en SQL puisque le nombre de colonnes est variable.
    Dans la mesure où c'est pour faire une extraction excel le plus simple me semble être de le faire en VBA :
    - une requete sur les sociétés définit les lignes
    - une requete sur les contacts remplit les colonnes
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  3. #3
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,
    tu peux essayer ceci :
    - insère dans un module la fonction suivante :
    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
    Public Function MiseEnLigne(Société As String)
    Dim Item(1000) As Variant 'un tableau avec 1000 lignes = un nbre contacts qui ne sera jamais atteint
    Dim Argument As String, i As Integer, Séparateur As String
    Séparateur = " | "   ' |  = <alt> 124
    Argument = "Code_Societé = """ & Société & """"
    Item(0) = DLookup("Code_Contact", "SOCIETE_CONTACTS", Argument) '= le 1er contact
    MiseEnLigne = Item(0)
    For i = 1 To UBound(Item)
       Argument = Argument & " and code_contact <> """ & Item(i - 1) & """"
       Item(i) = DLookup("Code_Contact", "SOCIETE_CONTACTS", Argument)
        If IsNull(Item(i)) Then Exit For   ' on s'arrête dès qu'on ne trouve pas de suivant
    Next i
    For i = 1 To UBound(Item)
       If Item(i) Then MiseEnLigne = MiseEnLigne & Séparateur & Item(i) 'on aligne les items trouvés
    Next i
    End Function
    - la requête qui te donne la liste des sociétés avec les contacts :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    SELECT SOCIETE.NomSociété, MiseEnLigne([Code_Societé]) AS Contacts
    FROM SOCIETE
    GROUP BY SOCIETE.NomSociété, SOCIETE.Code_Societé;
    Reviens si mes commentaires de la fonction ne sont pas suffisants ou si tu veux de l'aide pour l'adapter à ton cas particulier.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  4. #4
    Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 88
    Points : 60
    Points
    60
    Par défaut
    Bonjour, et merci nico84 et ClaudeLELOUP pour vos réponses.

    Claude, j'essaie d'adapter ta solution, mais je ne comprends pas ta requête : je ne devrais pas trouver les 2 tables SOCIETE et SOCIETE_CONTACT ?
    Et la fonction MiseEnLigne, elle doit être mise dans un critère ?
    J'ai mis en PJ un commencement de base (il s'agit d'un exemple, je ne peux évidemment pas fournir ma base de données qui est complètement confidentielle). Est-ce que tu crois qu'il serait possible de me mettre la requête, STP ?
    Je viens en plus de passer de Access2000 à Access2007, il faut s'habituer !

    A bientôt, j'espère.

    MelaAllIn
    Fichiers attachés Fichiers attachés

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Points : 156
    Points
    156
    Par défaut
    Bonjour,

    En fait tu peux utiliser excel pour faire cela.


    1° tu exportes ta table [SOCIETE_CONTACT] vers excel (sans rien faire au niveau ACCESS.
    2° tu ouvres Excel et tu copies toutes tes données
    3° tu ouvres un autre classeur
    4° Tu fais Edition/Collage_Spéciale/Transpose

    Ainsi tu auras inversé tes colonnes et lignes.

    A partir de là tu as dans le sens désiré, tu peux facilement alors monter une formule pour remettre en ordre des contacts.
    (c'est que j'ai fait à partir de la ligne 11, fais le sur un autre onglet)

    par exemple voir l'image

    A+
    Christian de Montpellier

  6. #6
    Membre habitué
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    218
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 218
    Points : 156
    Points
    156
    Par défaut
    Re

    Par ailleurs j'ai trouvé cela

    http://support.microsoft.com/kb/283875/fr


    j'ai lu vite fait, il faut exporter vers excel, transposer comme je l'ai expliquer et importer vers une nouvelle table.

    puis de là utiliser le module donné par Microsoft.

    Cordialement
    Christian de montpellier

  7. #7
    Rédacteur/Modérateur

    Avatar de ClaudeLELOUP
    Homme Profil pro
    Chercheur de loisirs (ayant trouvé tous les jours !)
    Inscrit en
    Novembre 2006
    Messages
    20 594
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 78
    Localisation : Belgique

    Informations professionnelles :
    Activité : Chercheur de loisirs (ayant trouvé tous les jours !)
    Secteur : Finance

    Informations forums :
    Inscription : Novembre 2006
    Messages : 20 594
    Points : 281 907
    Points
    281 907
    Par défaut
    Bonjour,
    J’ai regardé ta base.
    La vie est compliquée !
    D’après les explications de ton 1er post, je t’ai préparé une solution avec un code société numérique.
    Tu l’as défini « long », jusque là çà va, mais après ½ heure de recherche, je vois que tu l’as défini avec une liste de choix où ce numérique est transformé en 2ème colonne d’une requête !

    le numérique « 1 » est en réalité « societe1 » et la fonction proposée se plante évidemment.

    Reviens-moi si les solutions de crissud ne te conviennent.
    Je verrai alors comment adapter.
    SVP ne m'envoyez pas de messages privés pour poser des questions techniques, vous n'aurez pas de réponse !

  8. #8
    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 : 51
    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,

    tu peux faire un truc comme ca: (d'après la structure de l'exemple)
    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TRANSFORM First([NomContact])
    SELECT [Societe]
    FROM SOCIETE_CONTACT
    GROUP BY [Societe]
    PIVOT "Contact " & DCount("*","SOCIETE_CONTACT","Societe=" & Societe & " AND NomContact<='" & NomContact & "'");
    l'inconvénient de ne pas avoir un id unique ordinal pour les contacts oblige la création de ce champ approximatif pour le pivot.
    l'inconvénient c'est que dans ce cas les contacts sont mis en ordre croissant et pas par ordre de saisie et qu'il ne faut pas qu'il y ai de doublon dans les contacts pour la même société.


  9. #9
    Membre du Club
    Femme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    88
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 88
    Points : 60
    Points
    60
    Par défaut
    Hello tout le monde !

    Heureuse de voir que mon problème suscite autant d'intérêt !
    J'avais pensé à faire le traitement dans Excel, qui est relativement simple, mais cela n'est pas possible. En effet, on doit publier cette liste toutes les semaines, et ce n'est pas forcément moi qui le fera, donc il faudrait tout automatiser...
    Par contre, la solution de vodiem marche super bien sur mon exemple, donc je pense que je vais l'adapter à ma base ! Dans la mesure où je n'ai pas de doublons dans mes contacts, ça ne devrait pas poser de problème !

    Merci à tout le monde pour votre aide : l'utilisation du forum est toujours aussi efficace ! Un seul regret, ne pas avoir assez de compétences en Access pour vous rendre la pareil !

    MelaAllIn

  10. #10
    Membre à l'essai
    Homme Profil pro
    Enseignant
    Inscrit en
    Octobre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

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

    Informations forums :
    Inscription : Octobre 2014
    Messages : 15
    Points : 11
    Points
    11
    Par défaut
    bonjour, j'ai le même problème,

    j'au une table nommé Contrat (IDcontrat, nom, capital, date décès) une table bénéficiaire (IDbeneficiaire, nom, prénom, adresse) et un table intermédiaire nommé Désignation qui porte les clé primaires des deux table (IDcontrat, IDbeneficiiare)
    sachant qu'un contrat peux avoir au maximum 6 bénéficiaire (donc 6 lignes bénéficiaire par Contrat)

    la table indignation enregistre les deux clé primaires a chaque fois que je saisi un bénéficiaire pour un contrat donnée.

    ce pendant je souhaite faire unen requete sql qui va afficher : contrat.IDcontrat | contrat.Nom, contrat.capital | Benficiare.beneficiare1 | Bénéficiaire.beneficiaire 2| ....| Beneficiaire.beneficiaire 6

    Pouvez vous m'aider SVP. sachant que je suis sur access 2016.

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

Discussions similaires

  1. Transposer des lignes en colonnes
    Par EternalNod dans le forum BIRT
    Réponses: 1
    Dernier message: 08/10/2013, 17h19
  2. Transposer des lignes en colonnes
    Par sniper75 dans le forum SAS Base
    Réponses: 6
    Dernier message: 08/10/2012, 13h11
  3. transposer des lignes en colonnes
    Par Zet dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 29/10/2009, 20h05
  4. Boucle sur des lignes et colonnes
    Par Livet dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 27/08/2007, 19h45
  5. [T-SQL] Convertir des lignes en colonne
    Par cortex93 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 07/12/2005, 16h17

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