sequelize group by multiple columns

SQL与Sequelize中的分组查询

SQL中的分组查询

SQL查询中,通GROUP BY语名实现分组查询。GROUP BY子句要和聚合函数配合使用才能完成分组查询,在SELECT查询的字段中,如果没有使用聚合函数就必须出现在ORDER BY子句中。分组查询后,查询结果为一个或多个列分组后的结果集。

GROUP BY语法

SELECT 列名, 聚合函数(列名)
FROM 表名
WHERE 列名 operator value
GROUP BY 列名 
[HAVING 条件表达式] [WITH ROLLUP]

在以上语句中:
聚合函数 - 分组查询通常要与聚合函数一起使用,聚合函数包括:

  • COUNT()-用于统计记录条数
  • SUM()-用于计算字段的值的总和
  • AVG()-用于计算字段的值的平均值
  • MAX-用于查找查询字段的最大值
  • MIX-用于查找查询字段的最小值
  • GROUP BY子名-用于指定分组的字段
    HAVING子名-用于过滤分组结果,符合条件表达式的结果将会被显示
    WITH ROLLUP子名-用于指定追加一条记录,用于汇总前面的数据

    Sequelize中的分组查询

    使用聚合函数

    Sequelize提供了聚合函数,可以直接对模型进行聚合查询:

  • aggregate(field, aggregateFunction, [options])-通过指定的聚合函数进行查询
  • sum(field, [options])-求和
  • count(field, [options])-统计查询结果数
  • max(field, [options])-查询最大值
  • min(field, [options])-查询最小值 以上这些聚合函数中,可以通过options.attributes、options.attributes属性指定分组相关字段,并可以通过options.having指定过滤条件,但没有直接指定WITH ROLLUP子句的参数。
  • 如,使用.sum()查询订单数量大于1的用户订单额:
    Order.sum('price', {attributes:['name'], group:'name', plain:false, having:['COUNT(?)>?', 'name', 1]}).then(function(result){ console.log(result);})

    生成的SQL语句如下:
    SELECT name, sum(price) AS sumFROMordersASOrders GROUP BY name HAVING COUNT('name')>1;

    使用聚合参数

    除直接使用聚合函数外,也可以在findAll()等方法中,指定聚合查询相关参数实现聚合查询。查询时,同样可以通过通过options.attributes、options.attributes属性指定分组相关字段,并可以通过options.having指定过滤条件。与直接使用聚合函数查询不一样,通过参数构建聚合查询时,要以数组或对象形式设置options.attributes参数中的聚合字段,并需要通过sequelize.fn()方法传入聚合函数。

    如,使用.findAll()查询订单数量大于1的用户订单额:
    Order.findAll({attributes:['name', [sequelize.fn('SUM', sequelize.col('price')), 'sum']], group:'name', having:['COUNT(?)>?', 'name', 1],raw:true}).then(function(result){ console.log(result);})

    生成的SQL语句如下:
    SELECT name, sum(price) AS sumFROMordersASOrders GROUP BY name HAVING COUNT('name')>1;

  • Mr_zebra
    4年前
  •