我在这里遇到了挑战。
我有一张看起来像这样的表。
| DayDate |EndDate | Rate |
-----------------------------------
| 2013-07-01 |2013-08-05 | 200.00 |
| 2013-08-06 |2013-10-20 | 150.00 |
| 2013-10-21 |2013-12-31 | 130.00 |
我喜欢运行一个查询,该查询应该返回给定日期范围内的每日费率值。 例如,我想查询从2013-08-03到2013-08-08的每日费率,预期结果应如下所示。
| From | To | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 |
---------------------------------------------------------------------------
|2013-08-03 |2013-08-08 | 200.00 | 200.00 | 150.00 | 150.00 | 150.00 |
在我的项目范围内,添加到列中的天数不会超过30天,通常平均为3到10天。我希望看到一些很酷的想法和有效的方法来生成如上所述的结果。
为避免日期列混淆,查询会生成搜索周期之间天数的日期列。
感谢。
答案 0 :(得分:0)
假设:您有一个静态日历表,其中包含一列DAY_DT和每个日期一行。 我在我的例子中称它为CAL_DAY,因为它与我们在数据仓库中使用的名称相同。
使用以下查询,您只需在主查询中添加新的MAX()列,并使用更多CASE语句来扩展查询以反映更大的范围。
SELECT MAX(MIN_DAY_DT),
MAX(MAX_DAY_DT),
MAX(D1) AS "Day 1",
MAX(D2) AS "Day 2",
MAX(D3) AS "Day 3",
MAX(D4) AS "Day 4",
MAX(D5) AS "Day 5"
FROM(
SELECT cmin.DAY_DT AS MIN_DAY_DT,
cmax.DAY_DT AS MAX_DAY_DT,
CASE WHEN cd.DAY_DT = cmin.DAY_DT + 1 THEN rt.Rate ELSE 0 END AS "D1",
CASE WHEN cd.DAY_DT = cmin.DAY_DT + 2 THEN rt.Rate ELSE 0 END AS "D2",
CASE WHEN cd.DAY_DT = cmin.DAY_DT + 3 THEN rt.Rate ELSE 0 END AS "D3",
CASE WHEN cd.DAY_DT = cmin.DAY_DT + 4 THEN rt.Rate ELSE 0 END AS "D4",
CASE WHEN cd.DAY_DT = cmin.DAY_DT + 5 THEN rt.Rate ELSE 0 END AS "D5"
FROM CAL_DAY cd
JOIN CAL_DAY cmin
ON (cd.DAY_DT >= cmin.DAY_DT)
JOIN CAL_DAY cmax
ON (cd.DAY_DT <= cmax.DAY_DT)
LEFT JOIN RateTable rt ON
(cd.DAY_DT BETWEEN rt.DayDate AND rt.EndDate)
WHERE cmin.DAY_DT = '2013-08-03'
AND cmax.DAY_DT = '2013-08-08')