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

Requêtes MySQL Discussion :

Case et count(distinct())


Sujet :

Requêtes MySQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut Case et count(distinct())
    Bonjour,
    je viens de découvrir la fonction Case couplée à un agréga qui permet de faire des choses du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    select id_dept, SUM(nb_sejours),
    SUM(CASE WHEN e.statut = 'pub' THEN nb_sejours ELSE 0 END) nb_sejours_pub,
    SUM(CASE WHEN e.statut = 'priv' THEN nb_sejours ELSE 0 END) nb_sejours_priv
    from hospitalisation h
    inner etablissement e on e.id_etablissement = h.id_etablissement
    group by id_dept;
    sachant que mes tables sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    hospitalisation (id_temps, id_etablissement, id_pathologie,...,nb_sejours)
    etablissement (id_etablissement,..., statut,...)

    Imaginons que j'ai une table de travail contenant pour chaque hospitalisation, l'identifiant du patient, celui de l'établissement ainsi que d'autre données.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    venues (id_temps, id_patients, id_etablissement,...)
    Je souhaite connaitre le nombre de patients pris en charge dans les établissments privés ainsi que le nombre de patients pris en charge dans les établissments publics.
    Jusqu'à présent, je faisais deux requêtes dont je retravaillais les résultats :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    select id_dept, count(distinct(id_patients)) as nb_patients_pub
    from venues v
    inner etablissement e on e.id_etablissement = v.id_etablissement
    where e.statut='pub'
    group by id_dept;
     
    select id_dept, count(distinct(id_patients)) as nb_patients_priv
    from venues v
    inner etablissement e on e.id_etablissement = v.id_etablissement
    where e.statut='priv'
    group by id_dept;
    Est'il possible, à votre avis, d'avoir en une seule requête un résultats du type
    id_dept,nb_patients_pub,nb_patients_priv
    01,100,150
    02,11,22
    03,45,75
    ...

    Merci d'avance

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    bonjour,

    c'est ce que fait votre 1ere requete ... avec une jointure en moins.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut
    Bonjour,
    alors la petite subtilité, que j'aurais peut-être du souligner, c'est que ma première requête est une somme de séjours:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(CASE WHEN e.statut = 'pub' THEN nb_sejours ELSE 0 END) nb_sejours_pub
    alors que la deuxième compte le nombre de patient différents
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    count(DISTINCT(id_patients))
    Et je vois pas comment faire un count(distinct()) sur le même champs suivant un critère (ici le statut de l'établissement).

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Mai 2002
    Messages
    3 173
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2002
    Messages : 3 173
    Par défaut
    Construisez une première requête qui répartie par établissement le nombre de patient distinct.

    Ensuite intégrez cette 1ere requête dans une autre afin de regroupez au niveau dept votre résutlat et dispatcher le nombre privé / public grâce au case / when.

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 954
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 954
    Par défaut
    La même logique s'applique aussi au count, que donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    SELECT id_dept, 
           count(DISTINCT case when e.statut='pub'  then id_patients end) AS nb_patients_pub,
           count(DISTINCT case when e.statut='priv' then id_patients end) AS nb_patients_priv
      FROM venues v
      join etablissement e ON e.id_etablissement = v.id_etablissement
     WHERE e.statut in ('pub','priv')
     GROUP BY id_dept;
    Pour info CASE sans ELSE revient à faire ELSE NULL et un count(colonne) ne compte pas les NULLs
    Par ailleurs DISTINCT n'est pas une fonction, inutile de l'associer à des parenthèses.

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    74
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2005
    Messages : 74
    Par défaut
    punkoff :
    Votre solution ne fonctionne pas dans mon cas, un patient pouvant aller dans plusieurs établissements différents, par exemple un public puis un privé. Suivant les pathologie étudiée, je vais alors surestimer de manière importante mon nombre réel de patients.

    skuatamad :
    Merci, votre proposition de solution me convient parfaitement. Je ne savais pas que count ignorait les NULL. Il va falloir que je m'en souvienne !!

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

Discussions similaires

  1. [SQL2005] COUNT(CASE THEN (COUNT DISTINCT)) ?
    Par apnw7931 dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 10/07/2013, 15h08
  2. [débutant] COUNT(DISTINCT ...)
    Par lennelei dans le forum Access
    Réponses: 5
    Dernier message: 21/08/2007, 09h39
  3. [Sql]Having Count ( Distinct )
    Par nuke_y dans le forum Oracle
    Réponses: 5
    Dernier message: 20/02/2006, 21h36
  4. [SGBDR ACCES97] COUNT & DISTINCT
    Par totoche dans le forum Langage SQL
    Réponses: 2
    Dernier message: 20/12/2005, 09h24
  5. Query sur plusieurs colonnes avec count(distinct...)
    Par Jeankiki dans le forum Langage SQL
    Réponses: 2
    Dernier message: 18/08/2004, 15h22

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