Сосредоточить "Остальное" дела вместе для подсчета - PullRequest
0 голосов
/ 01 февраля 2019

Я пытаюсь выполнить подсчет элементов, соответствующих определенным критериям, сгруппированных по значению отдельного критерия.Я хочу отобразить счетчик каждого для значений от 0 до 4, а затем счет для всего, что больше 4.

Я пытаюсь:

SELECT
Count(*) as "Count", CASE
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) = 0 THEN "0" 
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) = 1 THEN "1" 
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) = 2 THEN "2" 
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) = 3 THEN "3" 
WHEN TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time) = 4 THEN "4"
ELSE ">4"
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 TIMESTAMPDIFF(DAY, scheduling_manualapproval.approved_on, slot.scheduled_date_time), status

Я надеялся, что это даст мне:

Count - Days Ahead - Status
55    - 0          - Kept
52    - 0          - Not-Kept
140   - 1          - Kept
32    - 1          - Not-Kept
27    - 2          - Kept
19    - 2          - Not-Kept
147   - 3          - Kept
67    - 3          - Not-Kept
8     - 4          - Kept
534   - 4          - Not-Kept
90    - >4         - Kept
50    - >4         - Not-Kept

Но вместо этого я получил:

Count - Days Ahead - Status
55    - 0          - Kept
52    - 0          - Not-Kept
140   - 1          - Kept
32    - 1          - Not-Kept
27    - 2          - Kept
19    - 2          - Not-Kept
147   - 3          - Kept
67    - 3          - Not-Kept
8     - 4          - Kept
534   - 4          - Not-Kept
10    - >4         - Kept
5     - >4         - Not-Kept
20    - >4         - Kept
15    - >4         - Not-Kept
30    - >4         - Kept
25    - >4         - Not-Kept
25    - >4         - Kept
3     - >4         - Not-Kept
5     - >4         - Kept
2     - >4         - Not-Kept

Где все> 4 случая были разделены, а не смешаны вместе.Как мне заставить их быть сосредоточенными?

Ответы [ 2 ]

0 голосов
/ 01 февраля 2019

Примерно так:

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)

Гордон указал, что вы можете группировать по псевдониму статуса, но я бырекомендую НЕ делать этого, опять же по причинам перекрестного мастерства - большинство других поставщиков баз данных, с которыми я сталкивался, не позволяют группировать по псевдониму в списке выбора, они настаивают на том, чтобы вы группировали по значению, выбранному до его псевдонима..

0 голосов
/ 01 февраля 2019

В MySQL вы можете использовать псевдонимы столбцов для агрегирования.Итак:

группа по «Дням впереди», статус

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...