Конструктор запросов Adonis: условный подсчет - PullRequest
0 голосов
/ 18 июня 2020

, поэтому я хочу сгруппировать список по дате, и в этой группе я хочу подсчитать столбец с заданным c значением.

Вот примерные значения этого таблица:

[
  {
     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 

, чтобы сгруппировать все заказы с одной и той же доставкой_date и вернуть дату и общее количество заказов в ней как total_orders.

теперь я хочу подсчитать все order_status со значением 0 и order_status со значением 1. Я застрял в этом на несколько часов, заранее спасибо!

UPDATE Временно отказался от использования построителей запросов, и я достиг того, что хочу, используя Database.raw(), но мне все еще нужно используйте построители запросов для обеспечения согласованности проекта. Может ли кто-нибудь помочь мне преобразовать это в версию 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'
      )

1 Ответ

0 голосов
/ 19 июня 2020

Я решил, но мне все равно нужно использовать 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')
...