如何获得 Oracle DB 查询所需的 GROUP BY 结果?

问题描述 投票:0回答:1

在使用 MySQL 多年后,我刚刚开始在 Oracle 数据库中工作,我对分组差异有点困惑。作为起点,假设我有这张

project
表:

id 名字 已创建
1 创建于9月2日 02-09-2023 00:00:00:000
2 创建于9月3日 03-09-2023 00:00:00:000
3 创建于10月2日 02-10-2023 00:00:00:000
4 创建于10月3日 2023 年 10 月 3 日 00:00:00:000
5 创建于10月4日 2023 年 4 月 10 日 00:00:00:000
6 创建于11月1日 2023 年 1 月 11 日 01:00:00:000

我正在尝试编写一个查询,以最终如下所示的格式给出在提供的日期范围内每个月内创建的

projects
的数量(例如
01-08-2023 00:00:00:000
04-12-2023 00:00:00:000
):

项目已创建 日期
0 2023 年 8 月
2 2023 年 9 月
3 2023 年 10 月
1 2023 年 11 月
0 2023 年 12 月

我将如何实现这一目标?到目前为止,我所有的尝试都以遇到各种与

GROUP BY
相关的 Oracle 错误(例如“ORA-00979”)而告终。

如果有帮助,这是我在 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;

感谢您提供的所有帮助。

编辑:

这是我迄今为止最接近的:

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');

这给了我这样的结果:

sql mysql oracle grouping
1个回答
0
投票
CREATE TABLE project (
    id NUMBER PRIMARY KEY,
    name VARCHAR2(255),
    created TIMESTAMP
);

INSERT INTO project (id, name, created) VALUES
(1, 'Created on September 2nd', TO_TIMESTAMP('02-09-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')),
(2, 'Created on September 3rd', TO_TIMESTAMP('03-09-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')),
(3, 'Created on October 2nd', TO_TIMESTAMP('02-10-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')),
(4, 'Created on October 3rd', TO_TIMESTAMP('03-10-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')),
(5, 'Created on October 4th', TO_TIMESTAMP('04-10-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')),
(6, 'Created on November 1st', TO_TIMESTAMP('01-11-2023 01:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3'));

查询:

SELECT 
  Count(DISTINCT p.id) AS projectsCreated, 
  TO_CHAR(p.created, 'Mon YYYY') AS dates 
FROM 
  project p 
WHERE   
    created BETWEEN TO_TIMESTAMP('01-08-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')
    AND TO_TIMESTAMP('04-12-2023 00:00:00:000', 'DD-MM-YYYY HH24:MI:SS:FF3')
GROUP BY 
  TO_CHAR(p.created, 'Mon YYYY')
ORDER BY 
  TO_CHAR(p.created, 'Mon YYYY') ASC;
项目已创建 日期
1 2023 年 11 月
3 2023 年 10 月
2 2023 年 9 月

小提琴

© www.soinside.com 2019 - 2024. All rights reserved.