Bonjour à tous,

Je dois réaliser une requête qui me permet de tracer par période une valorisation de salaire.
Ma difficulté est que le salaire de la table est entendu en temps complet.
Donc dans mon exemple, le mois d'avril ne constitue pas à proprement parler un changement de taux horaire mais d'horaire.
J'ai essayé de calculer un taux bidon pour m'en sortir, mais de toute façon ça ne corrige pas le tir correctement, dans le sens où dans ce cas précis, avril constitue une exception sur la période de janvier à juin.

En remarque le résultat obtenu et celui attendu. Je sens confusément que je passe à côté d'un truc gros comme le Golden Gate
Bref, merci d'éclairer ma lanterne, et bonne journée à tous.

PS : A toutes fins utiles, ma requête ne tournera que sur une année civile à la fois.

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
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
*/