-1

我有下表routes及其生效日期和到期日期。

r_no name eff_date exp_date
1 test1 01-jun-2013 INF
2 test2 10-jun-2013 15-jun-2013
3 test3 01-jan-2013 25-jun-2013
4 test4 01-feb-2013 31-dec-2013

输入将由用户给出,例如:2013 年 1 月 1 日至 2013 年 6 月 30 日`

我需要计算整个期间每一天的路线数。

Date Routes_Count
01-Jun-2013 3
02-Jun-2013 3
.
.
10-Jun-2013 4
.
.
20-Jun-2013 3
.
.
30-Jun-2013 2

有人可以帮助我使用 Oracle 11g 中的单个查询获得上述结果吗?

4

1 回答 1

1

你可以这样做,

WITH cte AS
     (SELECT     TO_DATE ('01-jun-2013', 'dd-mon-yyyy') + LEVEL - 1 dte
        FROM DUAL
      CONNECT BY LEVEL <=
                      TO_DATE ('30-jun-2013', 'dd-mon-yyyy') + 1
                    - TO_DATE ('01-jun-2013', 'dd-mon-yyyy'))
SELECT   cte.dte, COUNT (1)
    FROM cte, routes
   WHERE cte.dte BETWEEN NVL (routes.eff_date, '01-jan-0001')
                 AND NVL (routes.exp_date, '31-dec-4000')
GROUP BY cte.dte
ORDER BY 1;

sql小提琴

cte是我生成的临时表,它给出了从 6 月 1 日到 6 月 30 日的所有日期。将此与您的routes表连接起来,以使日期在路线的生效日期和到期日期之内。请注意,如果没有 exp_date 或 eff_date,我将其替换为未来太远或过去太远的日期。现在您已经获得了每个日期的所有路线,按日期分组,以获取计数。

于 2013-06-05T13:28:36.857 回答