Bonjour,
Je bloque à la résolution de mon problème, pour info il s'agit d'une base MS SQL 2005.
J'ai une liste de salariés avec par ordre la société, le matricule, la date de début, le type de sortie, la date de fin et le motif de sortie. Pour une meilleure compréhension j'ai généré un exemple ci dessous :
WITH TMP3 AS ( SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,36876 AS E_S_DATE, 2 AS E_S_TYP, 39256 AS E_S_DATES,'CP' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39257 AS E_S_DATE, 3 AS E_S_TYP, 39478 AS E_S_DATES,'CP' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39479 AS E_S_DATE, 2 AS E_S_TYP, 39683 AS E_S_DATES,'CP' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39684 AS E_S_DATE, 3 AS E_S_TYP, 39700 AS E_S_DATES,'CP' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39701 AS E_S_DATE, 1 AS E_S_TYP, 39750 AS E_S_DATES,'DEM' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39850 AS E_S_DATE, 2 AS E_S_TYP, 39900 AS E_S_DATES,'CP' AS MES_IDS
UNION
SELECT 'KAR' AS ENT_ID,'20012' AS SAL_MATR,39901 AS E_S_DATE, 2 AS E_S_TYP, 42367 AS E_S_DATES,'CP' AS MES_IDS )
SELECT ENT_ID,SAL_MATR,E_S_DATE,E_S_TYP,E_S_DATES,MES_IDS
FROM TMP3
cela ressemble au final à cela :
ENT_ID SAL_MATR E_S_DATE E_S_TYP E_S_DATES MES_IDS
KAR 20012 36876 2 39256 CP
KAR 20012 39257 3 39478 CP
KAR 20012 39479 2 39683 CP
KAR 20012 39684 3 39700 CP
KAR 20012 39701 1 39750 DEM
KAR 20012 39850 2 39900 CP
KAR 20012 39901 2 42367 CP
Je veux pouvoir grouper ces données de façon à n'avoir plus qu'une seule ligne par période juxtaposée. Ici on a deux périodes, la première du 36876 au 39750 puis du 39850 au 42367, je souhaite donc n'avoir plus que deux lignes avec ces dates (les dates sont gérées en INT afin de simplifier le système, il n'y a pas besoin des heures).
le résultat doit ressembler à cela
ENT_ID SAL_MATR E_S_DATE E_S_TYP E_S_DATES MES_IDS
KAR 20012 36876 1 39750 DEM
KAR 20012 39850 2 42367 CP
Mes connaissances en sql ne me semblent pas suffisantes pour résoudre ce problème. Selon moi il y a deux solutions :
- soit on trouve comment indiquer un élément commun aux enregistrements d'une même période puis on fait un group by avec un min et un max (je ne trouve pas comment faire)
- soit on vérifie pour chaque enregistrement s'il y en a un qui est juste avant et accolé (date de début = date de fin -1 de l'enregistrement précédent) mais il faudrait faire cela en boucle deux par deux en groupant à chaque fois chacune des deux lignes (je ne sais pas comment faire cela)
Si quelqu'un peut m'aider ou bien a une autre idée, vous êtes le bienvenue.
Merci par avance
Partager