如何在单个SQL查询中查找给定时间段内每一天的记录数?

时间:2013-06-05 09:13:14

标签: sql oracle oracle11g

我有下表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年6月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中使用单个查询获得上述结果吗?

1 个答案:

答案 0 :(得分: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 fiddle

这里cte是我生成的临时表,它提供了6月1日到6月30日的所有日期。将此加入您的routes表,以便日期在路线的有效和失效日期之内。请注意,如果没有exp_date或eff_date,我将其替换为将来太远或过去的日期。现在您已经获得了每个日期的所有路线,按日期分组,以获得计数。