Случай, когда заказ на оценку

У меня есть оператор Case When в SQL с несколькими условиями, и мне нужно, чтобы условия оценивались в правильном порядке. Это мой код

SELECT company_id, 
MIN(CASE WHEN number_of_orders >= 10 THEN order_month 
WHEN number_of_orders >= 1 AND number_of_orders < 10 THEN order_month 
ELSE NULL END) AS first_month_with_many_orders 
FROM monthly_orders

Мне нужно, чтобы первое условие number_of_orders >=10 оценивалось первым. Этот код, похоже, не выполняет этого, потому что у меня есть несколько компаний, у которых есть месяц, который удовлетворяет обоим условиям, поэтому он возвращает минимальный месяц, который удовлетворяет первому условию. Однако, что мне действительно нужно, так это минимальный месяц месяца, в котором> = 10 заказов, и я хочу, чтобы только второе условие применялось к компаниям, у которых нет месяцев с более чем 10 заказами.

Итак, как я могу получить первое условие для оценки, а затем перейти только ко второму условию, если оно не выполнено?

2 ответа

Во-первых, ваш случай SQL возвращается order_month в обоих случаях number_of_orders >= 10 а также number_of_orders >= 1 AND number_of_orders < 10, Это может быть неправильно, не уверен.

Во-вторых, я рекомендую подзапрос, что-то вроде этого:

SELECT company_id, MIN(theSubquery.month_with_many_orders) as first_month_with_many_orders
FROM (
  SELECT company_id, 
         CASE WHEN number_of_orders >= 10 THEN order_month 
              WHEN number_of_orders >= 1 AND number_of_orders < 10 THEN order_month 
         ELSE NULL END) AS month_with_many_orders
) AS theSubquery

Я не уверен в правильности деталей, так как больше информации не предоставляется. Но обычно я делаю опыт, что подзапросы позволяют делать шаги, которые более понятны. Вы могли бы даже избавиться от CASE и использовать WHERE в подзапросе, который был бы еще более читабельным.

Пытаясь получить то, что вы написали:

  • Если у компании есть хотя бы один месяц с 10 или более заказами, вам нужен первый месяц, когда это происходит
  • Если первое условие не выполняется в течение какого-либо месяца, вы хотите, чтобы в первом месяце был хотя бы один заказ
  • Или же вы хотите нулевые значения для тех компаний, у которых нет заказов

Если я прав, SQL будет:

SELECT 
     company_id, 
     IsNull((SELECT MIN(order_month) FROM monthly_orders WHERE company_id = A.company_id and number_of_order >= 10),(SELECT MIN(order_month) FROM monthly_orders WHERE company_id = A.company_id and number_of_order >= 1 and number_of_order < 10))
FROM monthly_orders A
GROUP BY company_id

SQL Fiddle

ОБНОВИТЬ

Другой запрос будет

 SELECT 
    A.company_id,
    min(case when MAX_ORDER = 0 then NULL ELSE order_month END) first_month_with_many_orders 
 FROM monthly_orders A
 INNER JOIN (SELECT company_id, MAX(number_of_order) MAX_ORDER FROM monthly_orders GROUP BY company_id) as B
     ON A.company_id = B.company_id
     AND number_of_order >= (CASE WHEN MAX_ORDER >= 10 THEN 10 WHEN MAX_ORDER >=1 THEN 1 ELSE 0 END)
 GROUP BY A.company_id

SQL Fiddle

Другие вопросы по тегам