Mám stůl s cenami. každá sazba má efektivní počáteční datum. (datum ukončení jakékoli sazby vyplývá z existence záznamu s novějším účinným počátečním datem.) Mám také tabulku s činnostmi. Každá aktivita nastává k datu.
Jaký je nejlepší způsob, jak sladit aktivitu s mírou platnou k tomuto datu?
(Bohužel nemám schopnost upravovat strukturu dat, takže přidávání explicitního data ukončení sazby je pryč.)
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
) ;
nebo GROUP BY
řešení:
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 ;