我有一张价格表。每个费率都有一个有效的开始日期。(任何利率的结束日期都由具有较新的有效开始日期的记录的存在所暗示。)我还有一张包含活动的表格。每个活动发生在一个日期。
将活动与该日期有效的费率相匹配的最佳方法是什么?
(不幸的是,我没有修改数据结构的能力,因此为费率添加明确的结束日期已经过时了。)
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
Run Code Online (Sandbox Code Playgroud)
ype*_*eᵀᴹ 11
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
) ;
Run Code Online (Sandbox Code Playgroud)
或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 ;
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
39142 次 |
最近记录: |