4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

SequelizeでGroup byを記述する

Posted at

Node.jsのORMであるSequelizeで、Group byを使ったCOUNT関数やSUM関数をどう書けばよいかを調べてみました(MySQLを使っている場合)。
例えば、以下の様なテーブルがあったとして、

Chargeテーブル
var Charge = sequelize.define('Charge', {
  userId: { Sequelize.INTEGER },
  companyId: { Sequelize.INTEGER },
  amount: { Sequelize.INTEGER }
});
SQL
SELECT companyId, SUM(amount) AS 'totalAmount'
FROM Charge
GROUP BY companyId;

みたいな感じでamountフィールドをcompanyId毎に集計したい場合は、

Sequelize
Charge.findAll({
  attributes: [
    'companyId',
    [sequelize.fn('sum', sequelize.col('amount')), 'totalAmount']
  ],
  group: ["companyId"]
}).then(function (results) {
  results.forEach(function(result){
    
  });
}).error(function(err){

});

と書くことができます。

[sequelize.fn('sum', sequelize.col('amount')), 'totalAmount']]
のsumの部分には、avg、count、min、maxなど、関数が使えそうです(すべての関数を試したわけじゃないです)。もちろん、関数は使用しているデータベースに依存すると思われます。

注意点

集計結果を取得するときに、例えば上記の例だと、totalAmountという別名を付けているので、result.totalAmountと書きたいところですが、これだとなぜかundefinedになってしまいます。
仕方ないので、result.dataValues['totalAmount']として値を参照しています。これはSequelizeのバージョン(テストに使ったSequelizeのバージョンは、1.7.9)に依存するバグなのかも知れません。

4
4
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
4

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?