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

如何将带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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.14 06:45:50