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 :
Comme ceci sera dans une plus grosse requête, y a t-il plus simple ?
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
Merci de vos avis.
Partager