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 avec Case When ..


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut Requête avec Case When ..
    Bonjour à tous!

    Je vous explique un peu mon contexte :

    J'ai un ID(qui n'est pas ma clé primaire) et un Status(qui est égal à CL ou CNCL)
    Pour une même clé, je peux avoir plusieurs status (plusieurs fois CL ou CNCL ou les 2 )

    Je voudrais, gràce à Case When affiché un troisième champs : Is_Provider qui serait égal à 0 ou 1.

    Il serait égal à 1 si Il y a au moins une fois CL dans les status pour un même ID.
    En clair si j'ai :
    ID | Status
    21 | CL
    21 | CNCL
    21 | CL

    Je voudrais affiché :
    Is_Provider | ID
    1 | 21

    Et si j'ai
    ID | Status
    22 | CNCL

    Je voudrais affiché :
    Is_Provider | ID
    0 | 22

    Et si j'ai
    ID | Status
    23 | CL

    Je voudrais affiché :
    Is_Provider | ID
    1 | 23

    Pour cela je pensais utiliser une condition du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select distinct (case when 
    	/* ici la condition */
    then 1 else 0 end) AS "Is_Provider",
    ID
    Quelqu'un a une idée de la condition?

    Merci d'avance =)

  2. #2
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    Salut !

    Si j'ai bien compris, on peut donner la règle :
    - s'il existe un "CL", alors provider
    - s'il existe un CNCL, mais pas de CL, alors non provider.

    C'est ça ?

    Dans ce cas, on va supposer que tes Id Existent dans une autre table de référence, et on va choper ton résultat en deux fois :
    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
     
    SELECT id, 1
    FROM TaTableDeReference a
    WHERE EXISTS (SELECT 1
    FROM TaTable b
    WHERE a.id = b.id
      AND b.status = 'CL'
    UNION ALL
    SELECT id, 0
    FROM TaTableDeReference a
    WHERE NOT EXISTS (SELECT 1
    FROM TaTable b
    WHERE a.id = b.id
      AND b.status = 'CL')
      AND EXITS (SELECT 1
    FROM TaTable b
    WHERE a.id = b.id
      AND b.status = 'CNCL')

  3. #3
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    Bonjour,

    Je n'ai pas bien compris ton histoire de table de référence ...

    En fait moi il faut que j'intègre ça dans une requête de création d'une table à partir de plein de tables différentes. (mais la création se fait par un select des autres tables)

    Il faut qu'il n'y ai qu'une ligne par ID.

    Il faut que, selon le status, je mette 1 ou 0 dans le champ Is_Provider.

    Je n'ai pas compris ta requête

    Il n'y a pas moyen de faire ça avec une requête de la forme case when ?
    Il n'y a pas quelque chose qui permet de comparer le champs avec le champs suivant?

    Merci de ton aide =)

  4. #4
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    En fait, ton case devrait analyser le résutlats de plusieurs lignes... ce qui n'est pas possible.
    Si je te parle d'une table de référence, c'est parce que les fameux id doivent venir de quelque part. Un endroit où cet Id est la clef primaire.

    Par exemple, si ta table est s'appelle lespaysvisitespardesgens, l'id ferait référence à des gens. Et du coup, on pourrait espérer qu'il existe une table "gens".

    Ensuite, la requête est assez simple :
    Pour chaque Id, tu regardes dans ta table si tu trouves une ligne CL : si tu trouves, tu choisis 1.
    Dans la deuxième partie de l'UNION ALL, tu cherches pour chaque Id si tu trouves un CNCL et que tu ne trouves aucun CL : tu affectes alors 0

    Tu es sous quel SGBD ?

  5. #5
    Membre Expert Avatar de Yanika_bzh
    Homme Profil pro
    Responsable Applicatif et R&D
    Inscrit en
    Février 2006
    Messages
    1 144
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Royaume-Uni

    Informations professionnelles :
    Activité : Responsable Applicatif et R&D
    Secteur : Finance

    Informations forums :
    Inscription : Février 2006
    Messages : 1 144
    Par défaut
    Ce genre de requete peut vous aider

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    select id, case (sum (case status when 'CL' then 1 else 0 end)) when 0 then 0 else 1 end from matable
    group by id
    A tester et adapter ...

    Bon courage

  6. #6
    Membre Expert Avatar de pacmann
    Homme Profil pro
    Consulté Oracle
    Inscrit en
    Juin 2004
    Messages
    1 626
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Consulté Oracle
    Secteur : Distribution

    Informations forums :
    Inscription : Juin 2004
    Messages : 1 626
    Par défaut
    [EDIT]
    J'ai dit une connerie, je retire

  7. #7
    Membre actif
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2008
    Messages
    48
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2008
    Messages : 48
    Par défaut
    Pacmann en fait je ne pense pas que tu aies dit une connerie et je pense la même chose ^^

    Yanika de Bretagne, ce que tu m'a donné en est la preuve :

    Je l'ai testé et j'ai toujours le même soucis : il me met une ligne pour le status CL et une autre pour le statut CNCL.
    Par contre il me met bien 1 pour la ligne avec CL et 0 pour la ligne avec le statut CNCL ^^ (mais ça je l'avais déjà )
    Or la table ne doit contenir qu'une ligne par id puisqu'elle sert ensuite à des calculs de moyenne...

    J'utilise Microsoft SQL Server 2005.

    Merci pour l'explication Pacmann, ta requête est pas mal, j'aurais été incapable de penser à ça tout seul ^^"

    Mais malheuresement je ne peux pas l'adapter à mon cas ...

Discussions similaires

  1. [SQL SERVER 2005] INSERT avec CASE WHEN
    Par djilos dans le forum Développement
    Réponses: 5
    Dernier message: 16/04/2010, 14h46
  2. Requête avec case
    Par rosedeeps dans le forum Développement
    Réponses: 1
    Dernier message: 21/07/2008, 13h14
  3. Probleme requête avec CASE
    Par chciken92000 dans le forum Langage SQL
    Réponses: 1
    Dernier message: 01/07/2008, 17h12
  4. Réponses: 5
    Dernier message: 26/02/2008, 12h42
  5. 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