Adonis 查询生成器:条件计数

Adonis Query Builder: Conditional Count

所以我想做的是按日期对列表进行分组,在该组中,我想计算具有特定值的列。

这是 table 的示例值:

[
  {
     id: 1,
     delivery_date: 2020-06-01,
     order_status: 0,
     quantity: 2
  },
  {
     id: 2,
     delivery_date: 2020-06-01,
     quantity: 2,
     order_status: 0,
  },

  {
     id: 3
     delivery_date: 2020-06-01,
     quantity: 2,
     order_status: 1,
  },
]

我现在查询这个

...
await Order
      .query()
      .select('delivery_date')
      .groupBy('delivery_date')
      .count('delivery_date as total_orders')

结果:

delivery_date: "2020-06-01"
total_orders: "6"

我想要达到的结果:

delivery_date: "2020-06-01",
total_orders: 6,
// The count of order_status with value of 0
pending_orders: 2 ,
// The count of order_status with value of 1
confirmed_orders: 2 

这样会将具有相同 delivery_date 和 return 日期的所有订单分组,并且其中的订单总数为 total_orders。

我现在要做的是统计所有0的order_status和1的order_status。已经被困了几个小时,提前致谢!

更新 暂时放弃使用 Query Builders,我使用 Database.raw() 实现了我想要的,但是为了项目的一致性我仍然需要使用 Query Builders,所以谁能帮我把它转换成 QueryBuilder 版本?

await Database
      .raw(
        'SELECT delivery_date, ' +
        'COUNT(*) FILTER (WHERE order_status = 0) as pending_orders, ' +
        'COUNT(*) FILTER (WHERE order_status = 1) as confirmed_orders, ' +
        'COUNT(*) FILTER (WHERE order_status = 2) as suspended_orders ' +
        'FROM orders ' +
        'GROUP BY delivery_date'
      )

我已经解决了,但是还是要用Database.raw

看起来像这样:

await Order
      .query()
      .select('delivery_date')
      .select(Database.raw('COUNT(*) FILTER (WHERE order_status = 0) as pending_orders'))
      .select(Database.raw('COUNT(*) FILTER (WHERE order_status = 1) as confirmed_orders'))
      .select(Database.raw('COUNT(*) FILTER (WHERE order_status = 2) as suspended_orders'))
      .groupBy('delivery_date')