如何在Oracle数据库中实现指定日期范围的GROUP BY分组统计?
Oracle 按月统计项目创建数量(含空月份)查询实现
长期使用MySQL,刚接触Oracle数据库,对两者分组逻辑差异存在困惑。需要编写Oracle查询语句,统计指定日期范围(01-08-2023 00:00:00:000至04-12-2023 00:00:00:000)内每个月的项目创建数量,需包含范围内无项目的月份(显示数量为0)。
现有project表数据
| id | name | created |
|---|---|---|
| 1 | Created on September 2nd | 02-09-2023 00:00:00:000 |
| 2 | Created on September 3rd | 03-09-2023 00:00:00:000 |
| 3 | Created on October 2nd | 02-10-2023 00:00:00:000 |
| 4 | Created on October 3rd | 03-10-2023 00:00:00:000 |
| 5 | Created on October 4th | 04-10-2023 00:00:00:000 |
| 6 | Created on November 1st | 01-11-2023 01:00:00:000 |
期望查询结果
| projectsCreated | date |
|---|---|
| 0 | Aug 2023 |
| 2 | Sep 2023 |
| 3 | Oct 2023 |
| 1 | Nov 2023 |
| 0 | Dec 2023 |
MySQL实现语句
在MySQL中已实现需求,语句如下:
SELECT Count(DISTINCT p.id) AS projectsCreated, Date_format(p.created, '%b %Y') AS date FROM project p WHERE ( Unix_timestamp(p.created) >= Unix_timestamp('01-08-2023 00:00:00') AND Unix_timestamp(p.created) <= Unix_timestamp('04-12-2023 00:00:00') ) GROUP BY date ORDER BY p.created ASC;
尝试的Oracle语句(均存在问题)
语句1:结果不符合预期
该语句未按月份分组统计,而是按每个id+月份分组,导致结果行数异常:
SELECT COUNT(p.id) as "COUNT(p.id)", TO_CHAR(p.created, 'Mon YYYY') as "createdDate" FROM project p WHERE ( p.created >= to_timestamp('2023-08-01 00:00:00', 'YYYY-MM-DD HH24:mi:SS') AND p.created <= to_timestamp('2023-12-04 00:00:00', 'YYYY-MM-DD HH24:mi:SS') ) GROUP BY p.id, TO_CHAR(p.created, 'Mon YYYY');
语句2:触发ORA-00979错误
错误原因是SELECT子句中包含未在GROUP BY中声明的列p.created:
SELECT Count(DISTINCT(id)) AS "projectsCreated", p.created, TO_CHAR(created, 'Mon YYYY') as "createdDate" FROM ( SELECT p.*, TO_CHAR(p.created, 'Mon YYYY') as "createdDate" FROM project p WHERE ( p.created >= to_timestamp('2023-08-01 00:00:00', 'YYYY-MM-DD HH24:mi:SS') AND p.created <= to_timestamp('2023-12-04 00:00:00', 'YYYY-MM-DD HH24:mi:SS') ) ) GROUP BY TO_CHAR(created, 'Mon YYYY') ORDER BY p.created ASC;
请求帮助
需要编写符合需求的Oracle查询语句:
- 按月份分组统计项目创建数量
- 包含指定日期范围内的所有月份(无项目的月份显示0)
- 避免GROUP BY相关错误
内容的提问来源于stack exchange,提问作者ClaytonAlanKinder
相关产品推荐
相关产品推荐

