1

我在这里遇到了挑战。

我有一张看起来像这样的桌子。

| 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 年 8 月 3 日到 2013 年 8 月 8 日每天的费率,预期结果应该如下所示。

|   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天之间。我希望看到一些很酷的想法和有效的方法来生成上述结果。

更新

为避免天数列混淆,天数列将由查询生成搜索周期之间的天数。

谢谢。

4

1 回答 1

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')
于 2013-03-18T13:05:29.930 回答