Pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter, inscrivez-vous gratuitement !

 

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut Vue SQL avec CASE WHEN imbriqués

    Bonjour,

    Après de nombreuses recherches et tests infructueux, je m'adresse à vous en dernier recours :
    Voici le contexte :
    Base de donnée SQL Server 2016 / Microsoft SQL Server Management Studio/ Je suis un utilisateur ayant appris sur le tas (forum etc) et avançant par essais erreurs.

    Voici mon problème :
    J'ai 4 tables : 1 tables d'article (bc) et 3 tables de tarifs (tarifA/tarifB/tarifC) et je souhaite créé une vue avec une colonne article et une colonne tarif (PA). Le tarif à afficher dépend d'une condition dont la donnée correspondante est issue de la table article. La règle de gestion est la suivante :

    Condition A : Si sref 1 = ‘ab’, ‘am’, ‘av’, ‘bm’, ‘bs’, ‘bv’, ‘cm’, ‘cs’, ‘cu’, ‘fe’, ‘fs’, ‘lb’, ‘nm’, ‘po’, ‘sg’, ‘vb, ‘vc’ afficher tarifA
    Condition B : Si sref 1 = ‘bo’, ‘cd’, ‘cn’, ‘db’, ‘dm’, ‘do’, ‘nc’, ‘ni’, ‘no’, ‘pb’ afficher tarifB
    Si ni A ni B alors
    Condition C : Si sref2 = ‘101’, ‘150’, ‘151’, ‘152’ afficher tarifB
    Condition D : Si non afficher tarifA
    Condition E : Si A B C D nul afficher tarifC
    Si E nul afficher 0

    Et voici pour le moment la "requête" que j'ai créé pour la colonne tarif (PA) mais qui ne fonctionne pas c'est à dire un prix (PA) est cherché et affiché mais il ne respecte pas les conditions ci-dessus:

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    ISNULL (isnull ( 
    CASE 
    WHEN dbo.bc.strtsref1 IN (‘ab’, 
                              ‘am’, 
                              ‘av’, 
                              ‘bm’, 
                              ‘bs’, 
                              ‘bv’, 
                              ‘cm’, 
                              ‘cs’, 
                              ‘cu’, 
                              ‘fe’, 
                              ‘fs’, 
                              ‘lb’, 
                              ‘nm’, 
                              ‘po’, 
                              ‘sg’, 
                              ‘vb’, 
                              ‘vc’) THEN 
      dbo.tarifA.pa 
      ELSE 
      CASE 
      WHEN dbo.bc.strtsref1 IN (‘bo’, 
                                ‘cd’, 
                                ‘cn’, 
                                ‘db’, 
                                ‘dm’, 
                                ‘do’, 
                                ‘nc’, 
                                ‘ni’, 
                                ‘no’, 
                                ‘pb’) THEN 
        dbo.tarifB.pa 
        ELSE 
        CASE 
        WHEN dbo.bc.strtsref2 IN (101’, 
                                  ‘150’, 
                                  ‘151’, 
                                  ‘152) THEN 
          dbo.tarifB.pa 
          ELSE dbo.tarifA.pa 
        END 
      END 
    END ;tarifC.pa);0)
    Avec mes remerciements

    PS : j'ai trouvé des topics de forums similaires mais aucun assez précis ou proche de mon cas que je puisse utiliser ou adapter à cause mes compétences limitées.

    Bruno

  2. #2
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 914
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 914
    Points : 10 084
    Points
    10 084

    Par défaut

    Bonjour,

    Concernant vos cas imbriqués, vous pourriez n'en faire qu'un, en évitant les ELSEEn effet, un CASE est évalués dans l'ordre d'écriture, si une condition est évaluée, c'est donc que les précédentes n'étaient pas vraies...

    Cependant, la requête que vous avez postée me semble correcte et devrait donner les bons résultats

    Cela, dit, j'ai du mal a comprendre précisément les règles de gestion, notamment, la D et E.
    Si ni A, ni, B, ni C ne sont vraies, alors la condition D s'applique, de fait, la E n'a pas de raison d'être, mais j'ai sans doute mal compris la logique. A moins que les tarifs puissent être nulls dans la base ?
    Un exemple expliquant les différents cas serait le bienvenu...



    u

  3. #3
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    Merci pour votre réponse et le temps que vous y avez consacré.

    A propos de votre premier point pour éviter un ELSE et si je comprends bien la syntaxe est la suivante ? :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    CASE  WHEN..... THEN......CASE WHEN.... THEN....END END
    En ce qui concerne votre second point :

    Ma requête aboutit ou à afficher tarifA ou à afficher le tarifC mais jamais le tarifB alors que des articles répondent aux critères pour tarifB

    Pour finir voici un exemple :

    Nom : exmple.JPG
Affichages : 52
Taille : 141,9 Ko

    Avec mes remerciements, si cela manque de précision j'essayerais de compléter.

  4. #4
    Modérateur

    Profil pro
    Inscrit en
    janvier 2010
    Messages
    4 914
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : janvier 2010
    Messages : 4 914
    Points : 10 084
    Points
    10 084

    Par défaut

    non, pour les case, la syntaxe serait plutot
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    CASE 
        WHEN ... THEN ...
        WHEN ... THEN ...
        WHEN ... THEN ...
        ELSE --eventuellement
    END
    Il y a donc bien plossibilité de NULL, ce qui explique certaines chose.
    De fait, votre utilisation des ISNULL est incorrecte : les paramétres doivent être séparés par des virgules et non des points virgules.
    Là encore, vous pourriez remplacer les ISNULL par un seul COALESCE, qui fonctionne de façon similaire mais n'est pas limitée à deux paramétres.

    Pour le reste, j'ai toujours un peu de mal a comprendre.
    Le dernier tableau est intitulé "résultat souhaité", mais n'est-ce pas plutôt le résultat obtenu ?
    De plus, vous semblez indiquer que 102 fait partie de ‘101’, ‘150’, ‘151’, ‘152’ ...

    idéalement, fournissez un jeu d'essai sous forme de CREATE TABLE #T (...) et de INSERT INTO #T... afin que l'on puisse tester également

  5. #5
    Nouveau Candidat au Club
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    juillet 2018
    Messages
    3
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 27
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Industrie

    Informations forums :
    Inscription : juillet 2018
    Messages : 3
    Points : 1
    Points
    1

    Par défaut

    Bonjour,

    Suite à nos échanges j'ai modifié ma requête et j'ai actuellement la requête ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    COALESCE (
    CASE
    WHEN dbo.BC.STRTSREF1 IN (‘AB‘, ‘AM‘, ‘AV ‘, ‘BM‘, ‘BS‘, ‘BV ‘, ‘CM ‘, ‘CS ‘, ‘CU‘, ‘FE‘, ‘FS‘, ‘LB‘, ‘NM‘, ‘PO‘, ‘SG‘, ‘VB‘, ‘VC‘) THEN dbo.tarifA.PA
    WHEN dbo.BC.STRTSREF1 IN (‘BO‘, ‘CD‘, ‘CN‘, ‘DB‘, ‘DM‘, ‘DO‘, ‘NC‘, ‘NI‘, ‘NO‘, ‘PB‘) THEN dbo.tarifB.PA 
    WHEN dbo.BC.STRTSREF2 IN (101‘, ‘150‘, ‘151‘, ‘152) THEN dbo.tarifB.PA
    ELSE dbo.tarifA.PA 
    END
    , dbo.tarfiC.PA, 0)
    AS PA,
    Effectivement ce sont les résultats que je souhaite obtenir et le 102 est une coquille je voulais écrire 101 ci dessous l'exemple corrigé :

    Nom : exemple_corrige.JPG
Affichages : 39
Taille : 144,8 Ko

    Maintenant j'ai deux nouveaux messages d'erreur successif :
    Nom : erreur1.JPG
Affichages : 40
Taille : 18,9 Ko Nom : erreur2.JPG
Affichages : 40
Taille : 12,7 Ko

    Pourtant je suis sûr que ma donnée STRTSREF1 et ma donnée STRTSREF2 sont de type (char8) et que mes valeurs dans les paraenthèses du "IN" sont bien présentes dans la table BC

    Malheureusement je ne maîtrise pas suffisamment SQL pour vous partager une table.

    Avec mes remerciements

    Bruno

  6. #6
    Membre régulier
    Homme Profil pro
    Inscrit en
    avril 2007
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : avril 2007
    Messages : 79
    Points : 108
    Points
    108

    Par défaut

    Bonjour,

    Citation Envoyé par BLNHRDT
    Malheureusement je ne maîtrise pas suffisamment SQL pour vous partager une table.
    Regardez les liens en bas de ce post, pas besoin d'être un spécialiste

    Bonne journée

Discussions similaires

  1. Réponses: 4
    Dernier message: 12/07/2016, 10h31
  2. [SQL SERVER 2005] INSERT avec CASE WHEN
    Par djilos dans le forum Développement
    Réponses: 5
    Dernier message: 16/04/2010, 14h46
  3. Problème avec des Case When imbriqués
    Par Orion01 dans le forum MS SQL-Server
    Réponses: 6
    Dernier message: 28/11/2007, 18h49
  4. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20

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