【问题标题】:Using case-when in aggregate function in Sequelize.js在 Sequelize.js 的聚合函数中使用 case-when
【发布时间】:2019-10-16 05:05:06
【问题描述】:

是否可以在模型上构建以下查询,而不是对原始 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']
})

【问题讨论】:

    标签: node.js postgresql sequelize.js


    【解决方案1】:

    一种解决方法是使用`Sequelize.literal()',如下图:

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

    【讨论】:

      猜你喜欢
      • 2018-04-21
      • 2011-04-17
      • 1970-01-01
      • 2021-05-08
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2022-11-26
      • 2014-02-24
      相关资源
      最近更新 更多