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 :

Requête SQL WHERE CASE WHEN EXIST avec valeur par défaut


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut Requête SQL WHERE CASE WHEN EXIST avec valeur par défaut
    Bonjour à tous,
    J'aimerais savoir si ma demande est faisable via une seule requête SQL.

    Contexte :
    J'ai une table TOTO qui possède 3 champs PRODUIT, CLIENT, PRIX
    Pour les champs PRODUIT et CLIENT, il existe une notion de valeur par défaut nommé 'Autres'.
    Ce qui fait que la table contient par exemple les enregistrements suivants
    PRODUIT CLIENT PRIX
    PRODUIT1 CLIENT1 10.0
    Autres CLIENT1 20.0
    PRODUIT1 Autres 30.0
    Autres Autres 40.0

    Ma demande :
    Ramener la ligne correspondant à un PRODUIT et un CLIENT donné

    Exemple :
    Si je cherche PRODUIT1 et CLIENT1, la requête doit me ramener PRODUIT1, CLIENT1, 10.0
    Si je cherche PRODUIT2 et CLIENT1, la requête doit me ramener Autres, CLIENT1, 20.0
    Si je cherche PRODUIT1 et CLIENT2, la requête doit me ramener PRODUIT1, Autres, 30.0
    Si je cherche PRODUIT2 et CLIENT2, la requête doit me ramener Autres, Autres, 40.0

    Aujourd'hui, je teste d'abord si la ligne PRODUIT1 et CLIENT1 existe
    Si elle existe, j'arrête
    Sinon, je cherche si la ligne Autres et CLIENT1 existe
    Si elle existe, j'arrête
    Sinon, je cherche si la ligne PRODUIT1 et Autres existe
    Si elle existe, j'arrête
    Sinon, je cherche si la ligne Autres et Autres existe (Elle existe toujours)
    Cela fait pas mal de requête et j'essaie d'optimiser tout ça
    Au final, la requête doit me ramener 1 et 1 seule ligne.

    J'étais tenté par ça mais ça me ramène 3 lignes (ce qui me paraît assez logique finalement)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    select *
      from TOTO t
     where PRODUIT     = case when exists (select 1 
                                            from TOTO t1
                                           where t.PRODUIT = t1.PRODUIT
                                             and t.PRODUIT = 'ProduitCherché') then t.PRODUIT else 'Autres' end
       and CLIENT     = case when exists (select 1 
                                            from TOTO t2
                                           where t.CLIENT = t2.CLIENT
                                             and t.CLIENT = 'ClientCherché') then t.CLIENT else 'Autres' end
    Si vous avez une idée, je suis preneur.

    Merci
    Cordialement,
    Maxime

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

    Vous pouvez utiliser des auto-jointures et la fonction coalesce qui récupérera la 1ère valeur non nulle

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    Merci pour votre réponse mais j'ai du mal à comprendre comment ça pourrait fonctionner.
    Concrètement, à quoi ressemblerait la requête ?

    Merci

  4. #4
    Expert éminent
    Avatar de StringBuilder
    Homme Profil pro
    Chef de projets
    Inscrit en
    Février 2010
    Messages
    4 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Rhône (Rhône Alpes)

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

    Informations forums :
    Inscription : Février 2010
    Messages : 4 154
    Points : 7 403
    Points
    7 403
    Billets dans le blog
    1
    Par défaut
    De simples union suffisent.

    Mais ça risque de pas être bien rapide... Et vous n'avez pas intérêt à avoir plus de colonnes...

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    select prix from toto where produit = @produit and client = @client
    union all
    select prix from toto where produit = @produit and client = 'Autres' and not exists (select * from toto where produit = @produit and client = @client)
    union all
    select prix from toto where produit = 'Autres' and client = @client and not exists (select * from toto where produit = @produit and client = @client)
    union all
    select prix from toto where produit = 'Autres' and client = 'Autres' and not exists (select * from toto where produit = @produit or client = @client);

    Ou alors aussi un truc comme ça :
    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    with produit (produit)
    as
    (
    	select case count(*) when 0 then 'Autres' else @produit end from toto where produit = @produit
    ),
    client (client)
    as
    (
    	select case count(*) when 0 then 'Autres' else @client end from toto where client = @client
    )
    select t.prix
    from produit p
    cross join client c
    inner join toto t on t.produit = p.produit and t.client = c.client;

    Mais c'est très moche
    On ne jouit bien que de ce qu’on partage.

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2006
    Messages
    89
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2006
    Messages : 89
    Points : 51
    Points
    51
    Par défaut
    Bonjour,
    Merci pour la solution des unions.
    Ca suffira pour mon contexte.

    Cordialement,

Discussions similaires

  1. CASE WHEN EXISTS avec plusieurs colonne
    Par LOPEZ dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 28/10/2011, 11h43
  2. Record avec valeur par défaut
    Par Sancha dans le forum Langage
    Réponses: 30
    Dernier message: 16/12/2009, 12h09
  3. Réponses: 4
    Dernier message: 01/11/2008, 09h41
  4. Supprimer une colonne avec valeurs par défaut
    Par SlashOwnsU dans le forum MS SQL Server
    Réponses: 1
    Dernier message: 18/09/2006, 10h10

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