Bonjour
J'ai un petit problème avec la sélection d'un nombre d'enregistrements répondant à un critère particulier.
J'ai 3 tables : CLIENTS --> DOSSIERS --> ETAT_DOSSIERS
- un client a de 0 à n dossiers
- un dossier a de 1 à 4 états
- chaque état de dossier est représenté par un enregistrement
Ex :
CLIENT | ID
--------------
| TOTO
| TITI
DOSSIER | ID | CLIENT_ID
---------------------------
| DOS_1 | TOTO
| DOS_2 | TOTO
ETAT_DOSSIER | ID | ETAT
---------------------------
| DOS_1 | ouvert
| DOS_1 | refusé
| DOS_2 | ouvert
J'aimerais donc récupérer :
TOTO 1 (on ne compte pas le dossier refusé)
TITI 0 (on compte les clients qui n'ont pas de dossiers)
Ma première tentative ne me ramène pas les clients qui n'ont pas de dossiers (normal à cause du count) :
TOTO 1
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11 SELECT CLIENTS.ID, COUNT(DISTINCT ETAT_DOSSIERS.ETAT) FROM CLIENTS, DOSSIERS, ETAT_DOSSIERS WHERE DOSSIERS.ID_CLIENT=CLIENTS.ID AND ETAT_DOSSIERS.ID = DOSSIERS.ID AND ETAT_DOSSIERS.ETAT = 'ouvert' AND ETAT_DOSSIERS.ID NOT IN ( SELECT ETAT_DOSSIERS.ID FROM ETAT_DOSSIERS WHERE ETAT_DOSSIERS.ETAT IN ('fermé','abandonné','refusé') ) GROUP BY CLIENTS.ID
- ok : ne compte pas DOS_1 qui est refusé
- ko : n'affiche pas TITI 0
Ma seconde tentative me permet de récupérer les clients sans dossiers mais je n'arrive pas à rajouter le critère de sélection sur l'état du dossier :
TOTO 2
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8 SELECT CLIENTS.ID, COUNT(DISTINCT ETAT_DOSSIERS.ETAT) FROM CLIENTS LEFT OUTER JOIN DOSSIERS ON DOSSIERS.CLIENT_ID=CLIENTS.ID LEFT OUTER JOIN ETAT_DOSSIERS ON ( ETAT_DOSSIERS.ID = DOSSIERS.ID AND ETAT_DOSSIERS.ETAT = 'ouvert' ) GROUP BY CLIENTS.ID
TITI 0
- ko : compte DOS_1 qui est refusé
- ok : affiche bien TITI qui n'a pas de dossiers
Je n'arrive pas à rajouter les critères (select) dans le JOIN.
Si je rajoute mes critères avant le GROUP BY alors la requête ne ramène plus les clients sans dossiers.
Quelqu'un verrait il une solution ?
(je ne peux bien sûr pas toucher aux tables)
Merci
Partager