Случай, когда заказ на оценку
У меня есть оператор 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
ОБНОВИТЬ
Другой запрос будет
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