You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在PostgreSQL中按MM-YYYY而非DD-MM-YYYY进行分组统计?

按年月格式分组统计员工数据的SQL问题

我在PgAdmin中编写查询语句时,joining_date是日期类型,希望按MM_YYYY格式分组,而非默认的DD_MM_YYYY,以便合并相同employee_type的记录统计,但当前查询未得到预期结果。

测试数据与当前查询

创建表及插入数据的SQL:

create table employee(joining_date date, 
employee_type varchar, name character varying);

insert into employee values
('16-11-2022', 'Intern', 'ABBS'),
('11-11-2022', 'senior', 'ABBS'),
('12-11-2022', 'senior', 'ABBS'),
('11-11-2022', 'senior', 'ABBS'),
('12-11-2022', 'Intern', 'ABBS');

当前使用的查询语句:

select employee_type as emp, 
to_char(joining_date, 'MM_YY') as batch, 
count(employee_type) as num
from employee
GROUP BY employee_type, joining_date;

当前结果

empbatchnum
Intern11_221
senior11_221
Intern11_221
senior11_222

期望结果

empbatchnum
Intern11_222
senior11_223

解决方案

问题出在GROUP BY子句的分组依据:你当前按employee_type和完整的joining_date(精确到天)分组,所以即使转换为年月格式输出,底层还是按天区分记录,导致相同年月的同类型员工被拆分统计。

需要将分组依据改为年月维度,有两种常用方法:

方法1:直接使用格式化后的表达式分组

将GROUP BY中的joining_date替换为to_char(joining_date, 'MM_YY'),确保分组逻辑和输出的batch列一致:

select employee_type as emp, 
to_char(joining_date, 'MM_YY') as batch, 
count(employee_type) as num
from employee
GROUP BY employee_type, to_char(joining_date, 'MM_YY');

方法2:使用date_trunc截断到月份(更推荐)

date_trunc('month', joining_date)会将日期截断到当月第一天,以此作为分组依据,再转换为年月格式输出,这种方式更符合日期类型的处理逻辑:

select employee_type as emp, 
to_char(date_trunc('month', joining_date), 'MM_YY') as batch, 
count(employee_type) as num
from employee
GROUP BY employee_type, date_trunc('month', joining_date);

两种方法都能得到你期望的统计结果,将同类型同月份的员工合并计数。


内容的提问来源于stack exchange,提问作者codeanonym

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 11:10:39