按月循环SQL

时间:2019-05-27 11:31:24

标签: sql oracle loops date calendar

在Oracle SQL Developer中,我需要每月计算从第一天到今天的一些数字(例如计数)。如何通过在日期字段中更改月份来创建循环?现在我在WHERE子句上有一个时间范围,例如(date> ='2017-01-01'和date <'2019-01-01')。所以我需要的是一个表,该表计数几个月,并将结果插入两列:月(2019_01、2019_02等)和计数

1 个答案:

答案 0 :(得分:0)

这是一个可以帮助您完成所需工作的示例。它基于Scott的示例架构,其EMP表包含HIREDATE列,该列将与名为months的CTE联接;它利用分层查询来创建12个月的“日历”(这就是CONNECT BY子句的作用)。我想,您的情况将必须更改。

当前数据:

SQL> select empno, ename, hiredate
  2  from emp
  3  order by hiredate;

     EMPNO ENAME      HIREDATE
---------- ---------- ----------
      7369 SMITH      17.12.1980
      7499 ALLEN      20.02.1981
      7521 WARD       22.02.1981
      7566 JONES      02.04.1981
      7698 BLAKE      01.05.1981
      7782 CLARK      09.06.1981
      7844 TURNER     08.09.1981
      7654 MARTIN     28.09.1981
      7839 KING       17.11.1981
      7900 JAMES      03.12.1981
      7902 FORD       03.12.1981
      7934 MILLER     23.01.1982
      7788 SCOTT      09.12.1982
      7876 ADAMS      12.01.1983

14 rows selected.

SQL>

您可能需要的查询:

SQL> with months as
  2    (select add_months(date '1980-12-01', level - 1) mon
  3     from dual
  4     connect by level <= 12
  5    )
  6  select to_char(m.mon, 'mm.yyyy') mon,
  7         count(e.empno)
  8  from months m left join emp e on m.mon = trunc(e.hiredate, 'mm')
  9  group by m.mon
 10  order by m.mon;

MON     COUNT(E.EMPNO)
------- --------------
12.1980              1   --> Smith
01.1981              0
02.1981              2   --> Allen, Ward
03.1981              0
04.1981              1   --> Jones
05.1981              1   --> Blake
06.1981              1   --> Clark
07.1981              0
08.1981              0
09.1981              2   --> Turner, Martin
10.1981              0
11.1981              1   --> King

12 rows selected.

SQL>