如何将带HAVING COUNT的SQL查询改写为Sequelize查询并实现统计
问题描述
我有如下SQL查询:
SELECT company_id, COUNT(company_id) FROM core.non_ceased_companies_prod_unit GROUP BY company_id HAVING COUNT(company_id) > 1
该查询返回4行数据,第二列为无列名的计数值。我需要统计结果的行数(即公司数量,应为4)以及第二列的总和(即生产单元总数,应为11),最终得到如下格式的结果:
{ companies: 4, productions: 11 //(2+3+2+4) }
请提供对应的Sequelize查询实现方案。
解决方案
方案一:先获取分组数据再计算统计值
先执行原分组查询,再在代码层计算行数与总和,适合需要保留分组明细的场景:
const { Op } = require('sequelize'); async function getCompanyProductionStats() { // 执行分组查询,给计数值指定别名方便后续处理 const groupedData = await sequelize.query( `SELECT company_id, COUNT(company_id) AS unit_count FROM core.non_ceased_companies_prod_unit GROUP BY company_id HAVING COUNT(company_id) > 1`, { type: sequelize.QueryTypes.SELECT } ); // 计算目标统计值 const companies = groupedData.length; const productions = groupedData.reduce((sum, item) => sum + item.unit_count, 0); return { companies, productions }; }
方案二:子查询直接完成SQL层统计
通过嵌套子查询直接返回最终统计结果,减少客户端数据处理,效率更高:
async function getCompanyProductionStats() { const [result] = await sequelize.query( `SELECT COUNT(*) AS companies, SUM(unit_count) AS productions FROM ( SELECT COUNT(company_id) AS unit_count FROM core.non_ceased_companies_prod_unit GROUP BY company_id HAVING COUNT(company_id) > 1 ) AS subquery`, { type: sequelize.QueryTypes.SELECT } ); // 转换为目标格式并确保数值类型正确 return { companies: parseInt(result.companies, 10), productions: parseInt(result.productions, 10) }; }
注意事项
- 两种方案都需要确保已初始化并连接好
sequelize实例 - 若使用Sequelize模型而非原生查询,也可通过
findAll配合group/having实现分组,再做后续计算,但原生查询在这类统计场景下更简洁
内容的提问来源于stack exchange,提问作者Vyacheslav Tarshevskiy
相关产品推荐
相关产品推荐

