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 :

Aide sur des Jointures


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut Aide sur des Jointures
    Bonjour,

    J'aurai besoin d'une petite aide vis à vis d'une requête que j'aimerais faire.
    J'ai 3 tables:
    - Interv (ID, Libellé)
    - Etude (ID, Document(booleen), Date_Fin, IDBureau, IDInterv)
    - Bureau (ID, Libellé)

    Une Interv peut générer zéro ou plusieurs études, une étude se référant à un et un seul bureau.

    j'aimerais que lorsqu'une interv. a plusieurs études, avoir les libellé des interv et les libellés des bureaux se référençant à une interv sur une même ligne.

    Pour le moment j'ai ceci comme requête:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    SELECT int.libelle AS libelle, Bureau.libelle AS libelle_Bu
      FROM Bureau, Interv AS int, Etude 
     WHERE int.ID = Etude.
       AND Etude.ID = Bureau.ID
    Mais ceci me retourne si j'ai 3 études par exemple pour l'interv ID = 3, 3 lignes avec le même libellé sur les 3 lignes et le libellé d'un Bureau différent avec.

    J'ai cherché un peu, j'ai essayé avec des LEFT OUTER JOIN, INNER JOIN Etc... mais sans succès (car ne m'y connaissant pas très bien dans l'utilisation de ces jointures)

    Je vous remercie de votre aide.

  2. #2
    Membre éprouvé Avatar de Oishiiii
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Août 2009
    Messages
    508
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur de base de données

    Informations forums :
    Inscription : Août 2009
    Messages : 508
    Points : 1 107
    Points
    1 107
    Par défaut
    Bonjour,

    Citation Envoyé par CaRTmaN68 Voir le message
    j'aimerai que lorsqu'une interv. à plusieurs études, avoir les libellé des interv et les libellés des bureaux se référencant à une interv sur une même ligne.
    Cela concerne l'affichage et n'a rien à voir avec les jointures, il faudrait faire cela du côté de l'application.
    C'est néanmoins possible avec la fonction GROUP_CONCAT() sur MySQL par exemple.

  3. #3
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Certes cela concerne l'affichage, mais est ce que avec une requête, on peut renvoyer ce type de ligne ?

    Ligne que j'aimerais avoir:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Libelle_interv | Libelle Bureau1 | Doc bureau1 | Libelle Bureau2 | Doc bureau2 | Libelle Bureau3 | Doc bureau3
    Enfaite je vais réutiliser ce résultat dans un tableau par la suite

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Bonjour,

    cherchez sur ce forum le mot clef "pivot"

  5. #5
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Merci pour cette petite aide, j'ai trouvé ce que j'aimerais faire, mais maintenant j'ai un petit soucis de mise en forme.

    j'ai ceci pour le moment:
    SELECT Intervention.libelle
    , CASE Etude.IDBureau WHEN 1 THEN Bureau.libelle END AS Bureau1
    , CASE Etude.IDBureau WHEN 2 THEN Bureau.libelle END AS Bureau2
    , CASE Etude.IDBureau WHEN 3 THEN Bureau.libelle END AS Bureau3
    FROM Intervention
    LEFT JOIN
    Etude
    ON Intervention.IDIntervention = Etude.IDIntervention
    LEFT JOIN
    Bureau
    ON Etude.IDBureau = Bureau.IDBureau
    GROUP BY Intervention.libelle
    Mon problème maintenant est que je n'ai rien qui s'affiche dans mes colonnes Bureau1 / Bureau2 / Bureau3.

    J'ai essayé avec:
    SUM(CASE Etude.IDBureau WHEN 1 THEN Bureau.libelle END) AS Bureau1
    Mais ça ne marche pas, normal vue que SUM c'est pour le numérique, alors que moi j'aimerais une chaine.

    Une petite aide s'il vous plait

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Le problème vient du group by.

    Essayez d'encadrer vos "CASE" avec la clause "MAX" par exemple.

    Mais ne connaissant pas vos donnée / structure je ne sais pas si ca répondra entièrement à votre problème.

  7. #7
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Quelques données:

    Table Intervention:

    ID_____Libelle
    1______Faire étape 1
    2______Faire étape 2
    3______Faire étape 3


    Table Etude:

    ID_____IDInterv._____IDBureau_____Document
    1________1____________1____________1
    2________1____________2____________1
    3________1____________3____________1
    4________2____________1____________0
    5________3____________3____________0


    Table Bureau:

    ID_____Libelle
    1______Informatique
    2______Electrique
    3______SAV


    Souhait résultat:

    Faire étape 1 / Informatique / Electrique / SAV

    Au lieu de:

    Faire étape 1 / Informatique
    Faire étape 1 / Electrique
    Faire étape 1 / SAV

  8. #8
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    C'est bon !
    Encadrer avec "MAX" avec la clause "CASE" marche nikel.

    Grand merci à toi punkoff

  9. #9
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Par contre avez-vous plus de 3 actions possibles par intervention ?

    La 1ere solution postée par Oishiiii était assez intéressante aussi.

  10. #10
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bonjour,

    Bon je viens de reprendre la requête, et je ne sais pas pourquoi mais elle ne va plus ...
    Cela m'affiche 5 lignes pour chaque intervention... :/
    Un autre problème s'ajoute encore.

    Tables:

    Intervention
    ID Libelle
    1 étape 1
    2 étape 2
    3 étape 3

    Bureau
    ID libelle
    1 Informatique
    2 Mecanique
    3 SAV

    Etude
    ID IDInterv IDBureau Document (booleen)
    1 / 1 / 1 / 1
    2 / 1 / 2 / 1
    3 / 1 / 3 / 1
    4 / 2 / 1 / 0
    5 / 3 / 3 / 0

    Commande
    ID NumeroCmd Stat IDIntervention
    1 / 5-55555 / 11 / 3
    2 / 2-22222 / 22 / 2
    3 / 3-33333 / 44 / 1
    4 / 1-11111 / 44 / 1

    Explication:

    j'aimerai rajouter les commandes également sur une même ligne comme pour les bureaux, sauf que pour les bureaux j'en ai que 3 alors que des commandes je peux en avoir de 0 à *.
    Est-ce possible d'obtenir le résultat que j'aimerai ?
    C'est à dire:
    Libelle_interv | Libelle Bureau1 | Doc bureau1 | Libelle Bureau2 | Doc bureau2 | Libelle Bureau3 | Doc bureau3 | Commande 1 | ... | Commande x

    merci de votre réponse.

    P.S.: GROUP_CONTACT ne marche pas

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 115
    Points : 28 493
    Points
    28 493
    Par défaut
    S'il s'agit de pivoter une poignée de lignes, on peut utiliser en effet les MAX(CASE...).
    Mais arrivé à ce niveau, ce n'est clairement plus dans le cadre d'une requête que ce problème doit être résolu.
    C'est de la mise en forme, de la cosmétique, qui doit être prise en charge par l'application.

  12. #12
    Futur Membre du Club
    Inscrit en
    Juin 2009
    Messages
    10
    Détails du profil
    Informations forums :
    Inscription : Juin 2009
    Messages : 10
    Points : 5
    Points
    5
    Par défaut
    Bon j'ai réussi à faire quelques chose pour avoir les bureaux sur la même ligne, mais comment je fais pour les commandes ne sachant pas combien il y en a ?

  13. #13
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Points : 5 345
    Points
    5 345
    Par défaut
    Sans un algorithme derrière vous n'y arriverez pas.

    Vu comment fonctionne le pivot mise en place vous allez devoir passer par une requête sql dynamique afin d'avoir le bon nombre de résultat dans votre clause SELECT.

    Bref créer une machine infernal.

    Donc la meilleur façon pour traiter ce cas c'est selon moi :
    - reprendre la solution de Oishiiii et afficher la sortie brute
    - faire une requête plus standard et re-travailler votre affichage selon votre bon vouloir (comme le suggérait al1_24)

Discussions similaires

  1. Aide sur des jointures
    Par nmdev dans le forum Requêtes et SQL.
    Réponses: 1
    Dernier message: 26/10/2008, 11h01
  2. Besoin d'aide pour des jointures de tables
    Par supersmoos dans le forum Requêtes
    Réponses: 4
    Dernier message: 14/12/2006, 16h38
  3. [HTML/CSS]Aide sur des div
    Par roudoudouduo dans le forum Mise en page CSS
    Réponses: 10
    Dernier message: 09/11/2006, 09h56
  4. [Oracle] Tris sur des jointure externes
    Par roychris dans le forum Langage SQL
    Réponses: 6
    Dernier message: 28/04/2006, 06h25
  5. [Regex] besoin d'aide sur des motifs
    Par Oluha dans le forum Général JavaScript
    Réponses: 13
    Dernier message: 25/11/2005, 12h23

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