Примерно так:
SELECT
Count(*) as "Count",
CASE
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) > 4 THEN '>4'
ELSE TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time)
END as "Days Ahead",
CASE
WHEN slot.cancel_reason_id is NULL THEN 'Kept'
ELSE 'not kept'
END as Status
FROM
scheduling_manualapproval
JOIN scheduling_possiblereschedule ON scheduling_manualapproval.related_suggestion_id = scheduling_possiblereschedule.id
JOIN scheduling_appointment AS slot ON scheduling_possiblereschedule.available_slot_id = slot.id
WHERE
scheduling_manualapproval.debug_info = ''
AND scheduling_manualapproval.action_type = 2
AND scheduling_manualapproval.action_complete = 1
GROUP BY
CASE
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) > 4 THEN '>4'
ELSE TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time)
END, status
Не использовать «для строк в SQL - используйте». Хотя MySQL поддерживает использование строк, разделенных «большинством других поставщиков, - привычка использовать»поддерживает ваши навыки работы с базами данных
Я изменил ваш случай, чтобы упростить его;по сути, нет смысла говорить: «если x = 1, то 1, если x = 2, то 2, если x = 3, то 3, если x = 4, затем 4, еще> 4» - мы можем повернуть его как «если X> 4, то> 4'else x "- то есть просто используйте X в качестве выходного значения, если оно не больше 4
. Вы должны сгруппировать по результату всего случая, а не по результату timestampdiff.То, что раньше происходило неправильно, заключалось в том, что вы группировали по значению разницы с отметкой времени, поэтому, если это было 5, вы получали группу за 5. Если 6, другую группу за 6. Если 7, еще одну группу .. и такна.Если вы хотите, чтобы «все, что больше 4» было просто одной группой, то вам нужно преобразовать значения 5, 6, 7, .. 999999 и т. Д. В одно значение «> 4», используя операторы и группу case.выходом регистра, а не выводом метки времени.
Если это трудно понять, давайте рассмотрим более простой пример:
ID Age
A 20
B 40
B 60
C 60
SELECT ID, AVG(Age) FROM t GROUP BY ID
A 20
B 50
C 60
SELECT CASE WHEN ID = 'A' THEN 'ayy' ELSE 'zed' END, AVG(Age) FROM t GROUP BY ID
ayy 20
zed 50
zed 60
Верхний запрос довольно очевидна, стандартная группировка.Нижняя часть немного более темная;группировка все еще выполняется по идентификатору, но затем, после группировки, идентификатор преобразуется: если это «A», он становится «ayy», иначе он становится «zed».Группировка разрешена, она сгенерировала 3 группы, потому что есть 3 различных значения ID.Это нормально, чтобы затем преобразовать буквы после того, как средние были вычислены.«zed» появляется дважды на выходе, потому что это перегруппированная группа B, а также перегруппированная группа C.Конечно, если мы сгруппировали по CASE WHEN, тогда будет выполнено преобразование, ТОГДА группа будет создана:
SELECT CASE WHEN ID = 'A' THEN 'ayy' ELSE 'zed' END, AVG(Age) FROM t
GROUP BY CASE WHEN ID = 'A' THEN 'ayy' ELSE 'zed' END
ayy 20
zed 53.33 --this is the (40 + 60 + 60)/3 (the B plus the other B plus the C, because they all transformed to zed before they were grouped)
Гордон указал, что вы можете группировать по псевдониму статуса, но я бырекомендую НЕ делать этого, опять же по причинам перекрестного мастерства - большинство других поставщиков баз данных, с которыми я сталкивался, не позволяют группировать по псевдониму в списке выбора, они настаивают на том, чтобы вы группировали по значению, выбранному до его псевдонима..