J'ai une table avec des tarifs. chaque taux a une date de début effective. (La date de fin de tout taux est impliquée par l'existence d'un enregistrement avec une date de début effective plus récente.) J'ai également un tableau avec les activités. Chaque activité a lieu à une date.
Quelle est la meilleure façon de faire correspondre une activité au taux en vigueur à cette date?
(malheureusement, je n'ai pas la possibilité de modifier la structure des données, donc l'ajout d'une date de fin explicite pour un taux est sorti.)
rates:
StartDate Rate
9/1/2010 17.00
10/1/2010 18.70
11/1/2010 20.00
Activities:
WorkCenter ActionDate Hours
WC1 9/30/2010 10
WC1 10/1/2010 5
WC2 10/30/2010 8
WC2 11/3/2010 9
Desired result:
Workcenter ActionDate Hours Rate Cost(=rate*hours)
WC1 9/30/2010 10 17.00 170.00
WC1 10/1/2010 5 18.70 93.50
WC2 10/30/2010 8 18.70 149.60
WC2 11/3/2010 9 20.00 180.00
SELECT
a.WorkCenter
, a.ActionDate
, a.Hours
, r.Rate
, r.Rate * a.Hours AS Cost
FROM
Activities AS a
JOIN
Rates AS r
ON r.StartDate =
( SELECT MAX(StartDate)
FROM Rates
WHERE StartDate <= a.ActionDate
) ;
ou un GROUP BY
Solution:
SELECT
a.WorkCenter
, a.ActionDate
, a.Hours
, r.Rate
, r.Rate * a.Hours AS Cost
FROM
Activities AS a
JOIN
( SELECT
a.ActionDate
, MAX(r.StartDate) AS StartDate
FROM
Activities AS a
JOIN
Rates AS r
ON r.StartDate <= a.ActionDate
GROUP BY a.ActionDate
) AS grp
ON grp.ActionDate = a.ActionDate
JOIN
Rates AS r
ON r.StartDate = grp.StartDate ;