料金表があります。各レートには有効な開始日があります。 (レートの終了日は、より新しい有効開始日を持つレコードの存在によって暗示されます。)また、アクティビティーのテーブルがあります。各アクティビティは日付に発生します。
その日に有効だったレートにアクティビティを一致させる最良の方法は何ですか?
(残念ながら、データ構造を変更することはできないため、レートの明示的な終了日を追加することはできません。)
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
) ;
またはGROUP BY
解決:
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 ;