В MySQL возвращает максимальное значение или null, если столбец имеет значение
Я пытаюсь получить максимальное значение MySQL select, но хочу иметь его null/empty / 0, если есть одна строка, не содержащая метки времени.
статистика таблицы (simplyfied):
ID CLIENT ORDER_DATE CANCEL_DATE
1 5 1213567200
2 5 1213567200
3 6 1210629600 1281736799
4 6 1210629600 1281736799
5 7 1201042800 1248386399
6 7 1201042800
7 8 1205449200 1271282399
Теперь я ищу, чтобы получить самую низкую дату заказа (без проблем, так как она никогда не пуста), и максимальная дата отмены. Если клиент уже отменил подписку, дата отмены заполняется, но если он все еще активен, дата отмены вообще отсутствует.
запрос:
SELECT ID, min(ORDER_DATE) AS OD, max(CANCEL_DATE) AS CD FROM stats GROUP BY CLIENT
возвращает:
ID OD CD
5 1213567200 // fine
6 1210629600 1281736799 // fine
7 1201042800 1248386399 // Should be empty
8 1205449200 1271282399 // fine
Я не могу понять, как вернуть пустой/0/NULL, если есть один (или несколько) пустых colums для клиента. Также пробовал с нулевыми полями.
Спасибо за любую подсказку.
2 ответов
Я не знаю как быстро это будет, но я думаю, это можно решить так:
SELECT ID, min(ORDER_DATE) AS OD,
IF(COUNT(*)=COUNT(CANCEL_DATE),max(CANCEL_DATE),NULL) AS CD
FROM stats GROUP BY CLIENT
Я не могу проверить это, но идея этого решения заключается в том, что count(cancel_date)
следует считать все записи не нулевого значения, и если он равен count(*)
это означает, что нет нулевых значений, и он вернет max(cancel_date)
, в противном случае null.
вы можете использовать такой запрос:
SELECT
client,
min(ORDER_DATE) AS OD,
case when MAX(CANCEL_DATE IS NULL)=0 THEN max(CANCEL_DATE) END AS CD
FROM
stats
GROUP BY
CLIENT
пожалуйста, смотрите fiddle здесь.
-
CANCEL_DATE IS NULL
будет оцениваться либо до 0, когда CANCEL_DATE не равен null, либо до 1, когда он равен null -
MAX(CANCEL_DATE IS NULL)
будет оцениваться как 0, если нет cancel_date со значениями null, иначе его значение будет 1. - , когда
MAX(CANCEL_DATE IS NULL)=0
это означает, что нет строк, где CANCEL_DATE равно null, и нам нужно вернуть MAX (cancel_date) в этом case, в противном случае нам нужно вернуть NULL.