Оператор CASE стр. 3 |
||||||||||||||
Рассмотрим еще несколько примеров. Посчитать количество рейсов из Ростова в Москву, и количество рейсов, выполняемых в остальные города. Здесь мы можем воспользоваться вычисляемым столбцом, по значениям которого будем выполнять группировку:
Посчитать общее количество рейсов из Ростова и количество рейсов, пунктом назначения которых не является Москва. В этой задаче тоже требуется выполнить агрегацию по двум выборкам, при этом одна из выборок является подмножеством второй. Поэтому здесь напрямую не подойдёт вычисляемый столбец, по которому можно выполнить группировку. Это годилось для решения предыдущей задачи, когда множество делилось на собственные непересекающиеся подмножества, по каждому из которых требовалось выполнить агрегацию. Для решения данной задачи мы можем посчитать количество по всему множеству и использовать подзапрос для подсчета значений в подмножестве (второе обращение к таблице) или использовать CASE в сочетании с агрегатной функцией, чтобы избежать повторного чтения таблицы. Давайте посмотрим, как оценит оптимизатор эти варианты. Использование подзапроса
Использование CASE с агрегатной функцией
Результат, естественно, будет одинаков:
Вы можете сравнить реальное время выполнения, если сгенерируете достаточный объём данных. Второй вариант можно записать более компактно, если использовать функцию NULLIF - сокращенный вариант частного случая использования CASE:
Функция NULLIF возвращает NULL, если её аргументы равны, или первый аргумент в противном случае. В решении используется тот факт, что агрегатные функции не учитывают NULL-значения, которые появляются в аргументе функции COUNT тогда, когда город прибытия равен 'Moscow'. |