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 utilisation de l'expression CASE


Sujet :

Langage SQL

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut Requête avec utilisation de l'expression CASE
    bonjour,

    Je doit créer une vue qui s'appuie sur une seule table mais qui modifie la valeur d'un champs.

    j'ai simplifié mon cas pour qu'il soit le plus clair possible

    j'ai une table AFFECTATION, qui contient la ou les affectations des individus. Je n'ai pas la main sur cette table ni sur la façon dont elle est remplie.

    idaffectation idutilisateur nomUtilisateur temoinAffectationPrincipale codeAffectation
    1 51 pierre N paris
    2 53 eric N rennes
    3 58 marc O lille
    4 58 marc N nantes


    je veux créer une vue V_AFFECTATION qui me sélectionne les informations de cette table mais qui me modifie le champs Témoin avec la condition suivante :
    si un individu n'a qu'une seule ligne (une seule affectation) on force le temoinAffectationPrincipale à 'O'.
    si l'individu possède une seule affectation, on considère que c'est son affectation principale.

    je ne vois pas trop comment faire et ne maîtrise pas bien le CASE
    Est ce possible de faire quelque chose du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    select idaffectation ,idUtilisateur
    nomUtilisateur,codeAffectation, 
    (CASE WHEN une seule ligne dans affectation THEN 'O' SINON valeur de temoinAffectationPrincipale) as temoinAffectationPrincipale
    from AFFECTATION ;
    Au final, la vue V_AFFECTATION doit me renvoyer :

    idaffectation idutilisateur nomUtilisateur temoinAffectationPrincipale codeAffectation
    1 51 pierre O paris
    2 53 eric O rennes
    3 58 marc O lille
    4 58 marc N nantes


    Merci d'avance.

  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
    Bonjour,

    C'est tout à fait possible, votre case est presque parfait, il faut juste ajouter le END : CASE condition THEN valeur ELSE autre valeur END AS alias

    Pour ce qui est de déterminer la présence d'autre lignes, vous pouvez soit utiliser une requête EXISTS (case when exists (votre requete de recherche d'une autre ligne) then...), soit faire une jointure OUTER et tester la valeur null d'une colonne non nullable (par exemple un identifiant, ce qui signifie jointure non satisfaite) dans votre CASE

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    merci pour la réponse.
    mais concrètement je ne vois pas comment écrire le sql qui correspond à l'algo que j'ai écrit.
    le EXISTS va me dire si il y a une ligne ou plusieurs.
    mais je veux tester le cas ou il y a une ligne et une seule.
    en passant par un count ?

  4. #4
    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
    Pas forcément

    exemple :

    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
    Create view...
     
    for select 
        col1, 
       ,col2... 
       ,case when not exists
                 (select 1 
                  from affectation as AF2
                  where AF2.idutilisateur = AF1.idutilisateur
                    and AF2.idaffectation <>AF1.idaffectation)
             then 'O'
             else temoinAffectationPrincipale
             end as truc    
       ,coln
    from affectation as AF1
    where ...
    order by ...
    ...

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2007
    Messages
    7
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2007
    Messages : 7
    Points : 6
    Points
    6
    Par défaut
    ca fonctionne.
    merci d'avoir pris le temps de répondre !

  6. #6
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Customer Success Manager @Vertica
    Inscrit en
    Septembre 2008
    Messages
    8 452
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Customer Success Manager @Vertica
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 452
    Points : 17 820
    Points
    17 820
    Par défaut
    Attention avec le EXISTS, sur un gros volume de données les performances vont probablement fortement se dégrader.

    Préférez une fonction de fenêtrage si votre SGBD les supporte :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    select idaffectation, idutilisateur, nomutilisateur, codeaffectation
         , case row_number() over(partition by idutilisateur order by idaffectation)
             when 1
             then 'O'
             else 'N'
           end as temoinaffectationprincipale
      from affectation;
    Ou sinon une version avec un agrégat :
    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
    with cte_affectation_utilisateur as
    (
      select idutilisateur
           , min(idaffectation) as idaffectation_min
        from affectation
    group by idutilisateur
    )
    select aff.idaffectation, aff.idutilisateur, aff.nomutilisateur, aff.codeaffectation
         , case afu.idaffectation_min
             when aff.idaffectation
             then 'O'
             else 'N'
           end as temoinaffectationprincipale
      from affectation                 aff 
      join cte_affectation_utilisateur afu
        on afu.idutilisateur = aff.idutilisateur;

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

Discussions similaires

  1. Réponses: 9
    Dernier message: 19/12/2011, 17h11
  2. Réponses: 2
    Dernier message: 14/06/2009, 11h12
  3. problème de requête avec utilisation de min/group by
    Par htristra dans le forum PostgreSQL
    Réponses: 0
    Dernier message: 02/10/2007, 13h16
  4. [Hibernate] Requête avec un LIKE %% case insensitive
    Par n@n¤u dans le forum Hibernate
    Réponses: 4
    Dernier message: 21/06/2006, 17h27
  5. Requête avec l'expression Like
    Par Mvu dans le forum ASP
    Réponses: 3
    Dernier message: 02/09/2003, 09h39

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