Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server
MS SQL-Server Forum Microsoft SQL-Server. Avant de poster -> FAQ SQL-Server, Tutoriels SQL-Server
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/08/2011, 13h14   #1
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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 :
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 13h54   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 13h55   #3
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
d'autre part,

n'y a-t-il pas une erreur dans :
Citation:
-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"
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 14h23   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bon

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

Code SQL :
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
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 15h02   #5
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
Oups il y a en bien une erreur
Citation:
-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
Type de fichier : jpg 2011-08-12_150045.jpg (12,6 Ko, 4 affichages)
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 15h09   #6
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
Par défaut Ce que je voudrais

Ce que je voudrais obtenir est:
Images attachées
Type de fichier : jpg 2011-08-12_150831.jpg (35,6 Ko, 4 affichages)
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/08/2011, 15h11   #7
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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..
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 16h26   #8
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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 :
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 29/08/2011, 17h26   #9
Futur Membre du Club
 
Homme
Médecin Département d'Information Médicale (DIM)
Inscription : janvier 2009
Messages : 77
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 : 77
Points : 18
Points : 18
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
Dr_No est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h34.


 
 
 
 
Partenaires

Hébergement Web