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 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61
| DECLARE @Salaires TABLE
(EmpId INT NOT NULL
,CDate DATETIME NOT NULL
,Salaire FLOAT
,Horaire FLOAT)
-- Population table
SET NOCOUNT ON;
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130131', 2000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130228', 2000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130331', 2000.00, 151.67)
-- Changement d'horaire
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130430', 2000.00, 121.33)
-- Retour horaire temps plein
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130531', 2000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130630', 2000.00, 151.67)
-- Augmentation
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130731', 3000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130831', 3000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20130930', 3000.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20131031', 3500.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20131130', 3500.00, 151.67)
INSERT INTO @Salaires(EmpId, CDate, Salaire, Horaire) VALUES (1, '20131231', 3500.00, 151.67);
SET NOCOUNT OFF;
-- KO
SELECT
EmpId
,CONVERT(CHAR(10), MIN(CDate), 103) AS DateDeb
,CONVERT(CHAR(10), MAX(CDate), 103) AS DateFin
,DENSE_RANK() OVER (PARTITION BY EmpId ORDER BY Salaire) AS RgSal -- j'identifie correctement les changements de rémunération
,DENSE_RANK() OVER (PARTITION BY EmpId ORDER BY Horaire) AS RgHor -- et les changements d'horaires, mais je n'arrive pas à gérer de plage contigües
,Salaire
,Horaire
,ROUND(Salaire / COALESCE(Horaire, 151.67), 2) AS SalHor
FROM @Salaires
GROUP BY
EmpId
,Salaire
,Horaire
ORDER BY
EmpId
,MONTH(MIN(CDate))
/*
Résultat obtenu
EmpId |DateDeb |DateFin |Salaire |Horaire
1 |31/01/2013 |30/06/2013 |2000 |151,67
1 |30/04/2013 |30/04/2013 |2000 |121,33
1 |31/07/2013 |30/09/2013 |3000 |151,67
1 |31/10/2013 |31/12/2013 |3500 |151,67
Résultat souhaité
EmpId |DateDeb |DateFin |Salaire |Horaire
1 |31/01/2013 |31/03/2013 |2000 |151,67
1 |30/04/2013 |30/04/2013 |2000 |121,33
1 |31/05/2013 |30/06/2013 |2000 |151,67
1 |31/07/2013 |30/09/2013 |3000 |151,67
1 |31/10/2013 |31/12/2013 |3500 |151,67
*/ |
Partager