如何在Sequelize中按当年createdAt月份与status字段执行GROUP BY分组查询
Sequelize 双维度分组统计实现方案
以下是按「本年度数据筛选、按创建月份+状态双维度分组统计」需求的完整实现代码:
首先导入Sequelize内置工具:const { Sequelize, Op, fn, col, literal } = require('sequelize');
以下示例适配MySQL数据库,其他数据库可对应调整日期函数:
// 请将YourModel替换为你实际使用的业务模型名 const statsResult = await YourModel.findAll({ attributes: [ // 提取创建时间的月份,别名为month [fn('MONTH', col('createdAt')), 'month'], // 保留状态字段 'status', // 统计每个分组的记录数,可根据需求替换为SUM/AVG等其他聚合函数 [fn('COUNT', col('id')), 'recordCount'] ], where: { createdAt: { // 筛选当前自然年的所有数据(当年1月1日0点至今) [Op.gte]: new Date(new Date().getFullYear(), 0, 1) } }, // 按月份、状态两个维度分组 group: ['month', 'status'], // 可选:按月份升序排序,方便结果按时间顺序展示 order: [[col('month'), 'ASC']] });
注意事项
- 如果你使用PostgreSQL数据库,提取月份的写法需要调整为:
[fn('EXTRACT', literal('MONTH FROM "createdAt"')), 'month'] - 如果需要输出月份全称/简称,可以直接调用数据库对应日期函数,比如MySQL的
MONTHNAME(createdAt),或查询后对结果做二次格式化 - 聚合规则可按需修改,如需统计分组内的金额总和,将
COUNT(id)替换为SUM(你要统计的金额字段名)即可
内容的提问来源于stack exchange,提问作者Yasiru Ayeshmantha
相关产品推荐
相关产品推荐

