如何在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;
当前结果
| emp | batch | num |
|---|---|---|
| Intern | 11_22 | 1 |
| senior | 11_22 | 1 |
| Intern | 11_22 | 1 |
| senior | 11_22 | 2 |
期望结果
| emp | batch | num |
|---|---|---|
| Intern | 11_22 | 2 |
| senior | 11_22 | 3 |
解决方案
问题出在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
相关产品推荐
相关产品推荐

