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 :

CASE … WHEN … COOKIES


Sujet :

Langage SQL

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut CASE … WHEN … COOKIES
    Bonjour,

    Admettons, en faisant simple que j'ai une table entreprise qui contient des noms de la grande distribution avec pour champs id et nom,
    puis une table magasin qui liste les magasins des différents entreprises avec pour champs id, entreprise_id, nom,
    puis une table produit qui liste les produits des différents magasins avec pour champs id, magasin_id, nom.

    Maintenant, parmi les produits, on peut avoir le produit ayant pour nom "cookies".

    Je souhaiterai avoir pour information la liste des entreprises :
    - ayant dans chacun de leur magasin des cookies (cookies présent)
    - n'ayant pas de cookies dans au moins un de leur magasin (cookies partiel)
    - n'ayant aucun cookies dans chacun de leur magasin (cookies absent)

    L'idéal serait de pouvoir retourner l'information en une seule requête afin de limiter le traitement en PHP, avec je pense l’utilisation d'un CASE WHEN qui pourrait renvoyer les expressions suivantes "cookies présent", "cookies partiel", "cookies absent" pour chaque entreprise.

    Je m'attends évidemment à une requête hyper balaise. J'avoue ne pas avoir les compétences pour savoir ce qu'elle pourrait être.
    Quelqu'un à une idée ?

  2. #2
    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
    Essayez ainsi :
    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
        select ent.entreprise_id
             , ent.Nom
             , case
                 when count(distinct mag.magasin_id) = count(distinct prd.produit_id)
                 then 'cookies présent'
                 when count(distinct mag.magasin_id) > count(distinct prd.produit_id)
                 then 'cookies partiel'
                 when count(prd.produit_id) = 0
                 then 'cookies absent'
               end as presence_cookie
          from Entreprises as ent
    inner join Magasins    as mag  on mag.entreprise_id = ent.entreprise_id
     left join Produits    as prd  on prd.magasin_id    = mag.magasin_id
                                  and prd.Nom           = 'cookies'
      group by ent.entreprise_id
             , ent.Nom;

  3. #3
    Membre à l'essai
    Profil pro
    Inscrit en
    Mai 2013
    Messages
    28
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2013
    Messages : 28
    Points : 17
    Points
    17
    Par défaut
    Impeccable, ça marche !!!

    Mais à condition qu'entre CASE et END je mette
    when count(prd.produit_id) = 0
    then 'cookies absent'
    avant
    when count(distinct mag.magasin_id) > count(distinct prd.produit_id)
    then 'cookies partiel'

    sinon 'cookies absent' n'apparaissait jamais dans les résultats car quand count(prd.produit_id) = 0,
    on a toujours count(distinct mag.magasin_id) > count(distinct prd.produit_id)
    puisqu'une entreprise qui possède des magasins sans cookies a forcément des magasins

    En tout cas, merci beaucoup Waldar, je vais mettre le sujet comme résolu !

  4. #4
    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
    Citation Envoyé par percevalseb Voir le message
    on a toujours count(distinct mag.magasin_id) > count(distinct prd.produit_id)
    puisqu'une entreprise qui possède des magasins sans cookies a forcément des magasins
    Bien observé, effectivement dans un CASE les conditions sont interprétées dans l'ordre, une fois une condition remplie on sort du case.

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 31/10/2005, 13h25
  2. case/when avec plusieurs valeurs pour le then
    Par Neo41 dans le forum Langage SQL
    Réponses: 7
    Dernier message: 02/09/2005, 15h58
  3. Pb avec case when !
    Par Brice Yao dans le forum Langage SQL
    Réponses: 11
    Dernier message: 05/08/2005, 08h20
  4. Structure CASE WHEN en Interbase
    Par tchaman dans le forum InterBase
    Réponses: 8
    Dernier message: 13/12/2004, 16h18
  5. [SQL] performances Decode ou Case when ?
    Par Yorglaa dans le forum Oracle
    Réponses: 8
    Dernier message: 01/10/2004, 15h50

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