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)に依存するバグなのかも知れません。