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

MS SQL Server Discussion :

SUM(CASE WHEN. ET AFFICHAGE CONDITIONNEL


Sujet :

MS SQL Server

  1. #1
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut SUM(CASE WHEN. ET AFFICHAGE CONDITIONNEL
    Bonjour

    Je cherche dans un premier temps à compter les occurrences d'un CODE dans une liste, disons ('X','Y','Z') et une liste ('K','L','M') ainsi que lorsque le code n'appartient à aucune liste:

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    SELECT MATABLE_1.NUM_DOSSIER,MATABLE_2.NOM,
    SUM(CASE WHEN CODE IN ('X','Y','Z') THEN 1 ELSE 0 END) AS CODE_DU_FORFAIT_A,
    SUM(CASE WHEN CODE IN ('K','L','M') THEN 1 ELSE 0 END) AS CODE_DU_FORFAIT_B,
    SUM(CASE WHEN CODE NOT IN ('X','Y','Z','K','L','M') THEN 1 ELSE 0 END) AS CODE_HORS_FORFAIT
    FROM MATABLE_1 INNER JOIN MATABLE_2 ON
    MATABLE_1.a=MATABLE_2.A
    WHERE (...)
    GROUP BY MATABLE_1.NUM_DOSSIER,MATABLE_2.NOM


    Cela m'affiche:

    -NUM_DOSSIER -NOM- -CODE_DU_FORFAIT_A- -CODE_DU_FORFAIT_B- -CODE_HORS_FORFAIT

    avec dans chaque colonne le nombre d'occurrences


    Je voudrais maintenant, sur ces critères avoir la chose suivante:

    -Sachant que si pour un NOM et un NUM_DOSSIER donné: Au moins une occurrence d'un code de la liste ('K','L','ZM) donne obligatoirement un FORFAIT_B, ce quelquesoit la présence ou non d'autres codes de l'autre liste ou n'appartenant à aucune liste

    -Sachant que la présence d'au moins un CODE de la liste ('X','Y','Z') mais SANS AUCUNE occurrence de code de la liste ('X','Y','Z') donne un FORFAIT_A

    -Dans les autres cas, un code n'appartenant à aucun CODE des 2 listes: ('K','L','M','X','Y','Z') donne ABSENCE_DE_FORFAIT

    Je veux afficher les colonne de la façon suivante:

    -NUM_DOSSIER -NOM- -TYPE_FORFAIT

    Comment faire?

    Merci de vos réponses

  2. #2
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bonjour

    Pourriez vous poster la DDL de vos tables, et surtout un jeu d'essai avec le résultat attendu, afin de mieux comprendre votre besoin

    merci

  3. #3
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    d'autre part,

    n'y a-t-il pas une erreur dans :
    -Sachant que la présence d'au moins un CODE de la liste ('X','Y','Z') mais SANS AUCUNE occurrence de code de la liste ('X','Y','Z') donne un FORFAIT_A
    Je pense que ce serait plutot
    "-Sachant que la présence d'au moins un CODE de la liste ('X','Y','Z') mais SANS AUCUNE occurrence de code de la liste ('K','L','M'') donne un FORFAIT_A"

  4. #4
    Modérateur

    Profil pro
    dba
    Inscrit en
    Janvier 2010
    Messages
    5 643
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : dba

    Informations forums :
    Inscription : Janvier 2010
    Messages : 5 643
    Points : 13 092
    Points
    13 092
    Par défaut
    Bon

    si j'ai bien compris votre problème, cette requête doit vous donner le résultat attendu (pas testée):

    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
    16
    17
    18
    19
    20
     
     
    SELECT 
    	MATABLE_1.NUM_DOSSIER,
    	MATABLE_2.NOM,
    	CASE
    		WHEN COUNT(FORFAITB.CODE) > 0 THEN 'FORFAIT B'
    		WHEN COUNT(FORFAITA.CODE) > 0 THEN 'FORFAIT A'
    		ELSE 'HORS FORFAIT'
    	END AS TYPE_FORFAIT
    FROM MATABLE_1 
    LEFT OUTER JOIN MATABLE_2 FORFAITB
    	ON MATABLE_1.a=FORFAITB.A
    	AND CODE IN ('K','L','Z')
    LEFT OUTER JOIN MATABLE_2 FORFAITA
    	ON MATABLE_1.a=FORFAITB.A
    	AND CODE IN ('X','Y','Z')
    GROUP BY 
    	MATABLE_1.NUM_DOSSIER,
    	MATABLE_2.NOM

    A noter qu'un CASE WHEN "s’arrête" dès qu'il a "trouvé" un prédicat vrai. C'est pourquoi dans la deuxième ligne (forfait A) je ne tiens pas compte de l'exclusion de la liste du forfait A, car s'il y avait l'un de ces codes, la première ligne "forfait B" serait avérée, et la deuxième ligne "forfait A" ne serait alors même pas évaluée.

    De même pour la suite oùje n'effectue aucune vérification, car si j'ai bien compris, on est hors forfait si l'on n'est ni en forfait A, ni en forfait B

  5. #5
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    Oups il y a en bien une erreur
    -Sachant que la présence d'au moins un CODE de la liste ('X','Y','Z') mais SANS AUCUNE occurrence de code de la liste ('K','L','M') donne un FORFAIT_A
    et une autre coquille; voilà ce que je veux:

    --Sachant que si pour un NOM et un NUM_DOSSIER donné: Au moins une occurrence d'un code de la liste ('K','L','M) donne obligatoirement un FORFAIT_B, ce quelquesoit la présence ou non d'autres codes de l'autre liste ou n'appartenant à aucune liste

    -Sachant que la présence d'au moins un CODE de la liste ('X','Y','Z') mais SANS AUCUNE occurrence de code de la liste ('K','L','M') donne un FORFAIT_A

    -Dans les autres cas, un code n'appartenant à aucun CODE des 2 listes: ('K','L','M','X','Y','Z') donne ABSENCE_DE_FORFAIT

    En pratique j'avais simplifié voici une copie de ce que j'obtiens:
    Images attachées Images attachées  

  6. #6
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Ce que je voudrais
    Ce que je voudrais obtenir est:
    Images attachées Images attachées  

  7. #7
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut
    En fait dans le 1er tableau, j'aimerais éviter de basculer dans EXCEL et faire un ET(SI.... et avoir juste la réponse sans le détail du calcul, puisqu'évidemment, il y a des milliers de lignes concernées..

  8. #8
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Merci aieeeuuuuu
    Bonjour et un peu tardivement...MERCI


    En fait mon problème venait du CASE WHEN car j'ignorais pourquoi en effet il s'arrêtait lorsqu''il' avait trouvé un prédicat VRAI.

    je croyais à une erreur de syntaxe de ma part..

    Par contre votre requête est -APPAREMMENT- équivalente à:

    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
    16
    17
    18
    19
    20
    21
    22
    23
    24
    SELECT MATABLE_1.NUM_DOSSIER,
    CASE	
    WHEN MATABLE1.NUM_DOSSIER IN
    (
    SELECT MATABLE1.NUM_DOSSIER
    FROM MATABLE1 INNER JOIN MATABLE2 ON
    MATABLE1.a=MATABLE2.A
    WHERE CODE IN  ('X','Y','Z') 
    )
    THEN FORFAIT_B
     
    WHEN MATABLE1.NUM_DOSSIER IN
    (
    SELECT MATABLE1.NUM_DOSSIER
    FROM MATABLE1 INNER JOIN MATABLE2 ON
    MATABLE1.a=MATABLE2.A
    WHERE CODE IN  ('K','L','M') 
    )
    THEN FORFAIT_A
    ELSE 'PAS_DE_FORFAIT'
    END AS TYPE_FORFAIT
     
    FROM TABLE1 INNER JOIN TABLE2 ON
    TABLE1.a=TABLE2.A

    Si cette requête est VRAIMENT équivalente (elle semble l'être sur mes données) y-a t'il un avantage quelquonque à choisir une syntaxe plutôt qu'une autre?

    Merci

  9. #9
    Membre du Club
    Homme Profil pro
    Médecin Département d'Information Médicale (DIM)
    Inscrit en
    Janvier 2009
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Médecin Département d'Information Médicale (DIM)
    Secteur : Santé

    Informations forums :
    Inscription : Janvier 2009
    Messages : 115
    Points : 60
    Points
    60
    Par défaut Par ailleurs Comment faire un COUNT avec le CASE WHEN
    Et comment compter le nombre de dossiers avec un FORFAIT_A et ceux avec un FORFAIT_B et ceux hors forfaits avec le CASE...WHEN

    et non pas calculer le nombre d'actes par forfaits (ça j'y arrive mais cela ne me sert à rien)

    En clair je voudrais le Nombre de NUM_DOSSIERS donnant tel ou tel Forfait:

    ex: Forfait_A: 15 NUM_DOSSIERS (peu importe le nombre d'actes éligibles à ce forfait)
    Forfait_B: 10 NUM_DOSSIERS (peu importe le nombre d'actes éligibles à ce forfait)


    et non pas

    Forfait_A: 123 Actes donnant ce forfait (par exemple)
    Forfait_B: 42 Actes donnant ce forfait

    Bon j'ai l'impression de ne pas forcément être trés clair

    Merci

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 20/11/2012, 12h54
  2. SUM(CASE WHEN THEN 1 ELSE 0 END) SUR PLUSIEURS LIGNES
    Par Dr_No dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 13/11/2012, 14h35
  3. Structure CASE WHEN en Interbase
    Par tchaman dans le forum InterBase
    Réponses: 8
    Dernier message: 13/12/2004, 16h18
  4. [SQL] performances Decode ou Case when ?
    Par Yorglaa dans le forum Oracle
    Réponses: 8
    Dernier message: 01/10/2004, 15h50
  5. [STRUTS] [JAVA] Affichage conditionnel de bean:write
    Par babylone7 dans le forum Struts 1
    Réponses: 6
    Dernier message: 29/04/2004, 16h20

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