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

Développement SQL Server Discussion :

Jointure conditionnelle - CASE WHEN dans la clause FROM [2012]


Sujet :

Développement SQL Server

  1. #1
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut Jointure conditionnelle - CASE WHEN dans la clause FROM
    Bonjour,

    Je cherche à résoudre un problème en utilisant des jointures conditionnelles. Je les utilise couramment, mais dans le cas suivant :

    Table n°1 : BonLivr
    Num Client Chantier
    128 Jean Lille
    214 Jean Paris

    Table n°2 : PrixRemis
    Client Chantier Prix
    Jean Lille 50
    Jean CONTRAT 70

    Résultat souhaité :
    Num PrixFacturé
    128 50

    Mon client Jean a un contrat pour un prix à 70. Pour son chantier Lille, je lui fais un prix à 50.

    Ma requete est la suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT	BonLivr.num, PrixRemis.Prix
     
    FROM BonLivr INNER JOIN PrixRemis ON BonLivr.Client = PrixRemis.Client AND CASE WHEN BonLivr.Chantier = PrixRemis.Chantier THEN BonLivr.Chantier ELSE 'CONTRAT' END = PrixRemis.Chantier
     
    WHERE BonLivr.Num = '128'
    J'obtiens le résutltat suivant :
    Num PrixFacturé
    128 50
    128 70

    Je ne comprends pas pourquoi j'obtiens 2 lignes, alors que le CASE ne devrait sélectionner que le cas où Chantier = Lille...

    Merci d'avance pour vos réponses.

    Bonne fin de journée !

  2. #2
    Modérateur
    Avatar de escartefigue
    Homme Profil pro
    bourreau
    Inscrit en
    Mars 2010
    Messages
    10 130
    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 130
    Points : 38 543
    Points
    38 543
    Billets dans le blog
    9
    Par défaut
    Bonjour,

    Le résultat est tout à fait normal, il est du au "ELSE" dans lequel vous forcez la valeur "CONTRAT" et du coup la condition de jointure est satisfaite et ramène la deuxième ligne

  3. #3
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Bonjour escartefigue, merci pour votre réponse !

    Mais alors, comment dois-je faire pour que la requete renvoie le prix CONTRAT (cas du Bon n° 214) ? Je pensais que le ELSE n'était traité que si la première condition n'était pas valide...

  4. #4
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 080
    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 080
    Points : 30 783
    Points
    30 783
    Par défaut
    Il faut le faire en deux étapes :
    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
    with    rqt
        as  (   SELECT	lvr.Num
                    ,   prx.Prix
                FROM    BonLivr     lvr
                    INNER JOIN 
                        PrixRemis   prx
                        ON  lvr.Client      = prx.Client 
                        AND lvr.Chantier    = prx.Chantier
            UNION ALL
                SELECT	lvr.Num
                    ,   prx.Prix
                FROM    BonLivr     lvr
                    INNER JOIN 
                        PrixRemis   prx
                        ON  prx.Client  = lvr.Client
                WHERE   prx.Chantier    = 'CONTRAT'
                    AND NOT EXISTS
                        (   select  null
                            from    PrixRemis   exc
                            where   exc.Client      = lvr.Client
                                and exc.Chantier    = lvr.Chantier
                        )
            )
    SELECT	Num
        ,   Prix
    WHERE   Num = '128'
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  5. #5
    Membre à l'essai
    Homme Profil pro
    Technicien réseau
    Inscrit en
    Novembre 2014
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : Belgique

    Informations professionnelles :
    Activité : Technicien réseau

    Informations forums :
    Inscription : Novembre 2014
    Messages : 15
    Points : 12
    Points
    12
    Par défaut
    Merci pour votre réponse Al1. J'essaie ça dès demain.

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

Discussions similaires

  1. Réponses: 6
    Dernier message: 25/04/2018, 16h26
  2. Case when dans la clause on
    Par Monstros Velu dans le forum Développement
    Réponses: 6
    Dernier message: 11/12/2009, 14h19
  3. CASE WHEN dans clause WHERE
    Par SpaceFrog dans le forum Requêtes
    Réponses: 13
    Dernier message: 20/11/2009, 14h23
  4. Erreur de syntaxe dans la clause from
    Par shub dans le forum Access
    Réponses: 1
    Dernier message: 12/06/2006, 20h24
  5. Réponses: 2
    Dernier message: 03/06/2006, 00h22

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