node.js - 在 Sequelize.js 的聚合函数中使用 case-when

标签 node.js postgresql sequelize.js

是否可以在模型上构建以下查询而不是对原始 sql 使用 sequilize.query()

select 
  queue,
  count(*) total,
  sum(case when type = 'Proactive' then 1 else 0 end) proactive,
  sum(case when type = 'Reactive' then 1 else 0 end) reactive
from "OpenIncidents" 
group by queue
order by total DESC;

我厌倦了将 sequelize.fn() 用于聚合函数,但在文档中找不到任何关于聚合函数支持 CASE WHEN 的信息。

我目前正在使用原始查询

return sequelize.query(
    `
    SELECT 
      queue, 
      COUNT(*) total, 
      SUM(CASE WHEN type = 'Proactive' THEN 1 ELSE 0 END) proactive, 
      SUM(CASE WHEN type = 'Reactive' THEN 1 ELSE 0 END) reactive 
    FROM "OpenIncidents" 
    GROUP BY queue 
    ORDER BY total DESC;
    `, 
    { type: sequelize.QueryTypes.SELECT })
  .then(queues => res.json(queues))
  .catch(err => res.status(400).json(err));

有没有办法直接在 Sequelize 模型上做,如下所示

return OpenIncident.findAll({
  attributes:[
    'queue',
    [sequelize.fn('COUNT', sequelize.col('id')), 'total'],
    [sequelize.fn('SUM', CASE_WHEN_STATEMENT, 'proactive'],
    [sequelize.fn('SUM', CASE_WHEN_STATEMENT), 'reactive']
  ],
  group: ['queue'],
  order: [sequelize.fn('COUNT', sequelize.col('id')), 'DESC']
})

最佳答案

一种解决方案是使用“Sequelize.literal()”,如下所示:

[Sequelize.fn('SUM', Sequelize.literal('CASE WHEN type = 'Proactive' THEN 1 ELSE 0 END')), 'proactive']     

关于node.js - 在 Sequelize.js 的聚合函数中使用 case-when,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56379980/

相关文章:

node.js - 在通过子句 Sequelize 中包含模型

postgresql - 如果在高负载场景下使用 HDFS 作为文件系统部署 PostgreSQL 会怎样?

postgresql - 我应该在 PostgreSQL 还是服务器后端过滤数据?

node.js - 无法使用 Node 运行服务器

javascript - Node js promise 使用嵌套循环

ruby-on-rails - 通过关系表 Rails 一对多

node.js - sequelize 的单个实例

sql - 如果在 postgres 中找不到记录,如何设置默认值

javascript - 如何判断函数在哪个文件中执行?

node.js - 在 Mongoose 中排序和区分