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 PostgreSQL Discussion :

Jointure 3 tables et résultat transposé


Sujet :

Requêtes PostgreSQL

  1. #1
    Futur Membre du Club
    Femme Profil pro
    tech SIG
    Inscrit en
    Juin 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : tech SIG
    Secteur : Services de proximité

    Informations forums :
    Inscription : Juin 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut Jointure 3 tables et résultat transposé
    Bonjour à tous,

    J'ai pas mal épluché les forums, mais je vous avoue ne pas arriver à transposer ce que j'ai pu lire à ma problématique .
    Je travaille sous postgres 12.

    J'ai trois tables:
    table des zones t_zone
    id_zone nom_zone
    1 nom_zone1
    2 nom_zone2

    table des données date1 t_donnee1
    id_donnee1 nom_zone valeur_donnee1 employe
    1 nom_zone1 1 A
    2 nom_zone1 2 B
    3 nom_zone2 1 B
    4 nom_zone2 2 A

    table des données date2 t_donnee2
    id_donnee2 nom_zone valeur_donnee2 employe
    1 nom_zone1 1 B
    2 nom_zone1 2 A
    3 nom_zone2 1 A
    4 nom_zone2 2 B

    Je souhaiterai comme résultat
    id_zone nom_zone valeur_donnee1 = 1 employe_donne1 = 1 valeur_donne1 = 2 employe_donne1 = 2 valeur_donnee2 = 1 employe_donne2 = 1 valeur_donne2 = 2 employe_donne2 = 2
    1 nom_zone1 1 A 2 B 1 B 2 A
    2 nom_zone2 1 B 2 A 1 A 2 B

    J'ai essayé ce type de requêtes:
    me multiplie autant de ligne que de valeurs possibles entre t_zone, t_donnee1 et t_donne2 (dans cet exemple 2^3)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    SELECT
    t_zone.id_zone,
    t_zone.nom_zone,
    t_donne1.valeur_donne1,
    t_donne1.employe,
    t_donne2.valeur_donne2,
    t_donne2.employe
    FROM t_zone
    LEFT JOIN t_donne1 ON t_zone.nom_zone = t_donne1.nom_zone
    LEFT JOIN t_donne2 ON t_zone.nom_zone = t_donne2.nom_zone
    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
    SELECT
    t_zone.id_zone,
    t_zone.nom_zone,
    t_donne1.valeur_donne1,
    t_donne1.employe,
    t_donne2.valeur_donne2,
    t_donne2.employe
    FROM t_zone
    LEFT JOIN 
      (SELECT DISTINCT t_donne1.valeur_donne1, t_donne1.employe
         FROM t_donne1
         GROUP BY t_donne1.valeur_donne1, t_donne1.employe) t_donne1
    ON t_zone.nom_zone = t_donne1.nom_zone
    LEFT JOIN 
      (SELECT DISTINCT t_donne2.valeur_donne2, t_donne2.employe
         FROM t_donne2
         GROUP BY t_donne2.valeur_donne2, t_donne2.employe) t_donne2
    ON t_zone.nom_zone = t_donne2.nom_zone
    me met un code erreur 21000 plus d'une ligne renvoyée par une sous-requête
    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
    select
    t_zone.id_zone,
    t_zone.nom_zone,
    (select t_donne1.valeur_donne1
      from t_donne1
      where t_zone.nom_zone = t_donne1.nom_zone) t_donne1_valeur_donne1,
    (select t_donne1.employe
      from t_donne1
      where t_zone.nom_zone = t_donne1.nom_zone) t_donne1_employe,
    (select t_donne2.valeur_donne2
      from t_donne2
      where t_zone.nom_zone = t_donne2.nom_zone) t_donne2_valeur_donne2,
    (select t_donne2.employe
      from t_donne2
      where t_zone.nom_zone = t_donne2.nom_zone) t_donne2_employe
    from t_zone
    Je tourne un peu (beaucoup) en rond et un peu d'aide m'éclairerait graaaaandement !
    D'avance merci pour votre retour!

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 134
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loir et Cher (Centre)

    Informations professionnelles :
    Activité : bourreau
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2010
    Messages : 10 134
    Points : 38 557
    Points
    38 557
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Ce que vous cherchez à faire est un pivot, plusieurs solutions sont proposées par Fadace dans son blog ici :
    https://fadace.developpez.com/mssql/pivot/

    Quelques adaptations seront peut-être nécessaires pour tenir compte des écarts syntaxiques entre SQL Server et PostgreSQL

  3. #3
    Futur Membre du Club
    Femme Profil pro
    tech SIG
    Inscrit en
    Juin 2018
    Messages
    7
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : tech SIG
    Secteur : Services de proximité

    Informations forums :
    Inscription : Juin 2018
    Messages : 7
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Je vous remercie pour ce retour!

    J'ai trouvé pour PostgreSQL l'extension tablefunc avec la fonction crosstab ce qui est un équivalent du pivot de SQLServer. J'ai commencé à tester quelques requêtes, dès que j'aurai trouvé la solution je la mettrai dans le fil de discussion.

  4. #4
    ced
    ced est déconnecté
    Rédacteur/Modérateur

    Avatar de ced
    Homme Profil pro
    Gestion de bases de données techniques
    Inscrit en
    Avril 2002
    Messages
    6 016
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : Gestion de bases de données techniques
    Secteur : Agroalimentaire - Agriculture

    Informations forums :
    Inscription : Avril 2002
    Messages : 6 016
    Points : 23 705
    Points
    23 705
    Par défaut
    Bonjour,

    Voici le lien vers un excellent billet blog dédié aux pivots sous PostgreSQL : https://blog-postgresql.verite.pro/2...tab-pivot.html
    Vous devriez y trouver toutes les réponses à vos questions. Sinon, n'hésitez pas à nous re-solliciter.

    ced
    Rédacteur / Modérateur SGBD et R
    Mes tutoriels et la FAQ MySQL

    ----------------------------------------------------
    Pensez aux balises code et au tag
    Une réponse vous a plu ? N'hésitez pas à y mettre un
    Je ne réponds pas aux questions techniques par message privé, les forums sont là pour ça

Discussions similaires

  1. SQL : jointure sur table qui fait qui enlève des résultats
    Par nysay27 dans le forum Langage SQL
    Réponses: 2
    Dernier message: 08/09/2020, 13h51
  2. Jointure de table avec Interbase
    Par ada_b dans le forum InterBase
    Réponses: 21
    Dernier message: 12/05/2010, 19h52
  3. Réponses: 7
    Dernier message: 10/02/2005, 00h13
  4. Jointure entre deux tables et résultat
    Par Asdorve dans le forum Langage SQL
    Réponses: 2
    Dernier message: 02/06/2004, 14h50
  5. requete(jointure 2 tables) qui marche pas
    Par DaxTaz dans le forum Langage SQL
    Réponses: 3
    Dernier message: 01/06/2004, 17h50

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