Bonjour,

Soit une table contrat contenant, entre autre, les colonnes suivantes :
- no_dossier_pers : numéro de dossier de la personne (en fait l'identifiant de l'individu) ;
- d_fin_contrat_trav : la date de fin du contrat de travail.

Les contrats en CDD ont une date de fin, les CDI bien sûr n'en ont pas (colonne à NULL... oui, je sais, c'est mal mais ce n'est pas moi qui ai conçu ça ! ).

Certaines personnes ont eu un ou plusieurs CDD puis un CDI. Il existe donc, pour ces personnes, au moins une ligne avec une date de fin non nulle et une avec une date de fin nulle.
D'autres personnes n'ont eu que un ou plusieurs CDD et ont donc une ou des lignes avec toujours une date de fin non nulle.

J'ai besoin de savoir pour chaque personne :
- quelle est la date de fin maxi s'il n'y a pas eu de CDI ensuite ;
- NULL si la personne est finalement en CDI.

Voilà la requête que j'ai pondue :
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
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
-- Ceux qui n'ont pas de contrat avec une date de fin non nulle
SELECT DISTINCT c.no_dossier_pers, NULL AS dern_fin_contrat
FROM mangue.contrat c
WHERE NOT EXISTS
(
	SELECT *
	FROM mangue.contrat c2
	WHERE c2.no_dossier_pers = c.no_dossier_pers
		AND c2.D_FIN_CONTRAT_TRAV IS NOT NULL
)
UNION
-- Ceux qui ont au moins un contrat avec une date de fin non nulle
SELECT cnn.no_dossier_pers,
	CASE
		WHEN cn.no_dossier_pers IS NULL THEN cnn.dern_fin_contrat
		ELSE NULL
	END AS dern_fin_contrat
FROM
(
	SELECT no_dossier_pers,
		MAX(D_FIN_CONTRAT_TRAV) AS dern_fin_contrat
	FROM mangue.contrat
	WHERE D_FIN_CONTRAT_TRAV IS NOT NULL
	GROUP BY no_dossier_pers
) cnn
LEFT JOIN
(
	SELECT DISTINCT no_dossier_pers
	FROM mangue.contrat
	WHERE D_FIN_CONTRAT_TRAV IS NULL
) cn ON cn.no_dossier_pers = cnn.no_dossier_pers
ORDER BY no_dossier_pers
Comme ceci sera dans une plus grosse requête, y a t-il plus simple ?

Merci de vos avis.