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

Langage SQL Discussion :

Besoin d'aide sur regroupement de résultats sur une ligne


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut Besoin d'aide sur regroupement de résultats sur une ligne
    Bonjour à tous,

    Tout d'abord je préviens je ne suis pas très doué en SQL.

    Je fais un select sur deux tables avec une jointure LEFT de ce type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT 
    entreprise.identifiant, 
    entreprise.raisonsociale, 
    correspondantentreprise.nom 
    FROM entreprise 
    LEFT JOIN correspondantentreprise 
    ON entreprise.identifiant = correspondantentreprise.identifiant
    la requête me renvoie deux lignes, car il y a deux correspondants entreprise différents pour une même entreprise.

    Je souhaiterais afficher le résultat sur une seule ligne, en créant une colonne "correspondant 1" et une colonne "correspondant 2". Ou bien regrouper les deux valeurs dans un seul champ, peu importe.

    Savez-vous comment on fait ? J'ai cherché mais sans succès...

    Merci pour votre aide !

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Bonjour,

    Peux-tu préciser pour quel système de base de données tu as ce besoin ?
    mySQL, SQL Server, Access, Oracle ?

    Parce que pour ce que tu demandes, il n'existe pas de syntaxe/méthode générique, il faut écrire du SQL propriétaire.

  3. #3
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Citation Envoyé par EddiGordo Voir le message
    Bonjour,

    Peux-tu préciser pour quel système de base de données tu as ce besoin ?
    mySQL, SQL Server, Access, Oracle ?

    Parce que pour ce que tu demandes, il n'existe pas de syntaxe/méthode générique, il faut écrire du SQL propriétaire.
    Désolé, j'ai oublié de préciser que je suis sur Oracle (11 il me semble). Merci pour ton aide.

  4. #4
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    bonjour

    Voici un code utilisable sur n'importe quel SGBD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  ent.identifiant
         ,  ent.raisonsociale 
         ,  cor1.nom !! ' ' !! cor2.nom
    FROM entreprise  ent
    LEFT JOIN correspondantentreprise cor1
      ON cor1.identifiant = ent.identifiant
    LEFT JOIN correspondantentreprise cor2
      ON cor2.identifiant = ent.identifiant
     AND cor2.nom         > cor1.nom
    Si votre SGBD connait les instructions LEAD et LAG il y a plus simple

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    197
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 197
    Points : 300
    Points
    300
    Par défaut
    Voici un code utilisable sur n'importe quel SGBD
    Sauf qu'ayant un nombre de lignes variables, il me semble difficilement acceptable d'avoir une instruction avec un select qui stipule des colonnes "en dur"... mais bon

    Sur Oracle tu peux utiliser LISTAGG : http://docs.oracle.com/cd/E11882_01/...htm#SQLRF30030

  6. #6
    Expert éminent sénior

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Charente Maritime (Poitou Charente)

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Points : 10 543
    Points
    10 543
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par escartefigue Voir le message
    bonjour

    Voici un code utilisable sur n'importe quel SGBD

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    SELECT  ent.identifiant
         ,  ent.raisonsociale 
         ,  cor1.nom !! ' ' !! cor2.nom
    FROM entreprise  ent
    LEFT JOIN correspondantentreprise cor1
      ON cor1.identifiant = ent.identifiant
    LEFT JOIN correspondantentreprise cor2
      ON cor2.identifiant = ent.identifiant
     AND cor2.nom         > cor1.nom
    Si votre SGBD connait les instructions LEAD et LAG il y a plus simple
    Malheureusement, même pas ! Ce code renvoie toujours 2 lignes. Certes, l'une d'entre elles correspondra à la demande, mais pas l'autre.

    S'il y a toujours 2 correspondants, il est possible de rajouter une clause WHERE filtrant les null sur le deuxième correspondant.

    Et encore, il faut que les deux correspondants ne soient pas des homonymes !

    Si le nombre de correspondants varie, le mieux serait de regrouper les différentes lignes en une seule. Je ne connais pas Oracle donc je ne sais pas ce qu'il est possible de faire. Sous SQL Server par exemple, j'aurais simplement fait une colonne XML qui contiendrait les différents correspondants.

  7. #7
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 338
    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 338
    Points : 39 735
    Points
    39 735
    Billets dans le blog
    9
    Par défaut
    Citation Envoyé par dorinf Voir le message
    Malheureusement, même pas ! Ce code renvoie toujours 2 lignes. Certes, l'une d'entre elles correspondra à la demande, mais pas l'autre.
    En effet, j'ai oublié le distinct.
    Mais comme le fait justement remarquer EddiGordo, ceci n'est valable que s'il y a 2 et seulement 2 lignes (ce qui correspond au contexte de la demande) mais surtout pas d'homonymes stricts, et là rien n'est sur !

  8. #8
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour,

    Dans ce cas, une solution comme celle-ci me semble plus simple :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    SELECT  ent.identifiant
         ,  ent.raisonsociale 
         ,  MIN(cor.nom ) AS correspondant1
         ,  NULLIF(MAX(cor.nom),MIN(cor.nom)) AS correspondant2
    FROM entreprise  ent
    LEFT JOIN correspondantentreprise cor
      ON cor.identifiant = ent.identifiant
    GROUP ent.identifiant
         ,  ent.raisonsociale
    ou alors utiliser une fonction de fenêtrage comme ROW_NUMBER() et pivoter les colonnes.

    Enfin le mieux serait de conserver la requete initiale (qui renvoi le résultat sur deux lignes) et de laisser le client se charger de la présentation.

  9. #9
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    Merci beaucoup pour votre aide, je vais étudier vos réponses

  10. #10
    Membre à l'essai
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Points : 11
    Points
    11
    Par défaut
    EDIT : En fait cela me semble OK, merci pour votre aide

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

Discussions similaires

  1. [PowerShell] Besoin d'aide pour listage des droits sur répertoire
    Par pastis 51 dans le forum Scripts/Batch
    Réponses: 6
    Dernier message: 25/09/2013, 10h28
  2. Besoin d'aide et de vos remarques sur mon diagramme de classes
    Par tawaha2010 dans le forum Diagrammes de Classes
    Réponses: 0
    Dernier message: 22/06/2012, 20h15
  3. Regroupement de résultats sur une seul ligne
    Par ximun974 dans le forum Requêtes
    Réponses: 3
    Dernier message: 30/12/2010, 12h55
  4. Besoin d'aide pour integrer un design sur du PHP
    Par cebri dans le forum Webdesign & Ergonomie
    Réponses: 5
    Dernier message: 01/12/2008, 08h33
  5. Besoin d'aide pour bloquer un nombre sur une TextBox
    Par Torrent74 dans le forum Flash
    Réponses: 2
    Dernier message: 24/10/2007, 20h14

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