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

如何在TypeORM中使用Repository的find方法结合MS SQL Server实现GROUP BY操作?

TypeORM 实现 GROUP BY 查询(MS SQL Server)

TypeORM的find()方法(含findMany())不支持直接配置GROUP BY,这类复杂分组查询得用QueryBuilder来实现,以下是具体示例和关键说明:

基础分组查询示例

假设你要按workshop字段分组,统计每个车间的总产量(以productionQty字段求和为例):

const groupedProduction = await this.dailyProductionRepository
  .createQueryBuilder('dp') // 'dp'是表的别名,可自定义
  .select('dp.workshop', 'workshop') // 指定分组字段,别名用于结果映射
  .addSelect('SUM(dp.productionQty)', 'totalProduction') // 聚合函数,计算分组后的总和
  .groupBy('dp.workshop') // 指定分组字段
  .getRawMany(); // 获取原始键值对结果,因为返回的是自定义结构而非实体实例

如果只是需要分组后的唯一字段值(比如去重的车间列表):

const uniqueWorkshops = await this.dailyProductionRepository
  .createQueryBuilder('dp')
  .select('dp.workshop', 'workshop')
  .groupBy('dp.workshop')
  .getRawMany();

带筛选条件的分组查询

可以用having对分组后的结果进行筛选(区别于where对原始数据的筛选),比如只保留总产量超过1000的车间:

const filteredGroups = await this.dailyProductionRepository
  .createQueryBuilder('dp')
  .select('dp.workshop', 'workshop')
  .addSelect('SUM(dp.productionQty)', 'totalProduction')
  .groupBy('dp.workshop')
  .having('SUM(dp.productionQty) > :minAmount', { minAmount: 1000 }) // 筛选分组结果
  .orderBy('totalProduction', 'DESC') // 按总产量降序排列
  .getRawMany();

关键注意事项

  • MS SQL Server要求:SELECT语句中的非聚合字段必须全部出现在GROUP BY子句中,否则会触发语法错误。
  • 结果获取:分组查询返回的是自定义结构而非实体类实例,所以用getRawMany();如果你的分组逻辑恰好返回符合实体结构的数据,也可以用getMany(),但这种场景很少见。
  • FindManyOptions局限性:该配置对象没有groupBy参数,因此无法通过find()方法实现分组查询,必须使用QueryBuilder。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 22:22:45