Union de ceux qui n'ont jamais eu de CDD et ceux qui en ont eu.
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 !:aie: ).
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:
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.