Выражение CASE в SQL: объяснение на примерах
Перевод статьи «SQL Case Statement Tutorial – With When-Then Clause Example Queries».
Photo by Denys Nevozhai on UnsplashВыражение СASE — это, по сути, SQL-версия условной логики. Это выражение может использоваться примерно так же, как if-предложения в языках программирования вроде JavaScript, хотя его структура немного отличается.
Данные для примера
Представьте, что вы преподаете литературу в школе. ваши ученики должны написать сочинение.
Вы создали следующую таблицу, чтобы отслеживать, кто из учеников уже сдал сочинение (там же проставляются оценки). Если ученик еще не сдал сочинение, в графе оценок значится NULL.
| STUDENT_ID | NAME | SUBMITTED_ESSAY | GRADE |
|---|---|---|---|
| 1 | Джон | TRUE | 86 |
| 2 | Саид | TRUE | 90 |
| 3 | Алиса | FALSE | NULL |
| 4 | Ной | TRUE | 68 |
| 5 | Элеанор | TRUE | 95 |
| 6 | Акико | FALSE | NULL |
| 7 | Отто | TRUE | 76 |
| 8 | Джамал | TRUE | 85 |
| 9 | Кьяра | TRUE | 88 |
| 10 | Клементина | FALSE | NULL |
Как написать выражение CASE в SQL
Допустим, вы хотели бы выводить ученикам сообщения о том, сдали они сочинение или нет.
Чтобы получить статус каждого ученика, вы можете просто выбрать столбец submitted_essay, но тогда в сообщении будет только TRUE или FALSE, а это не очень читабельно.
Вместо этого вы можете использовать выражение CASE и вывоить разные сообщения, основываясь на статусе в submitted_essay.
Базовая структура выражения CASE:
CASE WHEN... THEN... END
Использование CASE WHEN, THEN и END является обязательным, а ELSE и AS — опцональным. Выражение СASE должно идти внутри инструкции SELECT.
SELECT name, CASE WHEN submitted_essay IS TRUE THEN 'сочинение сдано!' ELSE 'сдай сочинение!' END AS status FROM students;
В приведенном выше примере мы выбрали имена учеников, а затем вывели разные сообщения в столбце status, основываясь на значении submitted_essay.
Результирующая таблица выглядит так:
| NAME | STATUS |
|---|---|
| Акико | сдай сочинение! |
| Клементина | сдай сочинение! |
| Алиса | сдай сочинение! |
| Саид | сочинение сдано! |
| Элеанор | сочинение сдано! |
| Отто | сочинение сдано! |
| Ной | сочинение сдано! |
| Кьяра | сочинение сдано! |
| Джон | сочинение сдано! |
| Джамал | сочинение сдано! |
Усложняем пример
Идем дальше.
Допустим, вы хотели бы включить в сообщение побольше информации. Если ученик уже сдал сочинение, вы хотели бы добавить в сообщение его оценку, а если нет — напомнить, что сочинение еще не сдано. Здесь нам пригодятся предложения WHEN/THEN.
SELECT name, essay_grade, CASE WHEN essay_grade >= 80 THEN 'молодец' WHEN essay_grade < 80 THEN 'можешь лучше' ELSE 'сдай сочинение!' END AS teacher_comment FROM students;
В этом примере кода мы вывели имена учеников, их оценки, а также комментарии, соответствующие оценкам.
После первого предложения WHEN/THEN вы можете добавить сколько угодно других WHEN/THEN, а также предложение ELSE, покрывающее все неучтенные случаи. Это аналог логики if... else if... else в JavaScript (или if. в Python и т. д.).
.. elif... else
Обратите внимание, что в этом случае предложение ELSE призвано захватить все сочинения с оценками NULL (т. е. еще не сданные сочинения), но в других ситуациях для проверки, является ли значение null, вы могли бы использовать IS NULL.
Не забывайте ставить END в конце вашего CASE-выражения!
В таблице представлены результаты этого запроса:
| NAME | ESSAY_GRADE | TEACHER_COMMENT |
|---|---|---|
| Акико | NULL | сдай сочинение! |
| Клементина | NULL | сдай сочинение! |
| Алиса | NULL | сдай сочинение! |
| Саид | 90 | молодец |
| Элеанор | 95 | молодец |
| Отто | 76 | можешь лучше |
| Ной | 68 | можешь лучше |
| Кьяра | 88 | молодец |
| Джон | 86 | молодец |
| Джамал | 85 | молодец |
Заключение
Выражения CASE легко понять и изучить.
Их применение — это лаконичный способ внести ясность в ваши SQL-запросы.
СЛУЧАЙ SQL | Промежуточный SQL
Начиная здесь? Этот урок является частью полного учебника по использованию SQL для анализа данных. Проверьте начало.
В этом уроке мы рассмотрим:
- Оператор SQL CASE
- Добавление нескольких условий в оператор CASE
- Краткий обзор основ CASE
- Использование CASE с агрегатными функциями
- Использование CASE внутри агрегатных функций
- Практические задачи
В течение следующих нескольких уроков вы будете работать с данными о футболистах колледжей. Эти данные были собраны с ESPN 15 января 2014 г. из списков, перечисленных на этой странице, с помощью парсера Python, доступного здесь. В этом конкретном уроке вы будете придерживаться информации о ростере. Эта таблица говорит сама за себя — одна строка на игрока со столбцами, описывающими атрибуты этого игрока.
SELECT * FROM benn.college_football_players
Оператор CASE — это способ SQL для обработки логики if/then. За оператором CASE следует как минимум одна пара операторов WHEN и THEN — эквивалент SQL оператора IF/THEN в Excel. Из-за этой пары у вас может возникнуть соблазн назвать это SQL CASE WHEN , но CASE является принятым термином.
Каждый оператор CASE должен заканчиваться оператором END . Оператор ELSE является необязательным и предоставляет способ захвата значений, не указанных в КОГДА / ТОГДА утверждений. проще всего понять в контексте примера:
SELECT player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' THEN 'да'
ELSE NULL END AS is_a_senior
ОТ benn.college_football_players
Проще говоря, вот что происходит:
- Оператор
CASEпроверяет каждую строку, чтобы убедиться в истинности условного оператора —year = 'SR'.
- Для любой заданной строки, если это условное утверждение истинно, слово «да» печатается в столбце, который мы назвали
is_a_senior. - В любой строке, для которой условное выражение ложно, ничего не происходит в этой строке, оставляя нулевое значение в столбце
is_a_senior. - В то же время, когда все это происходит, SQL извлекает и отображает все значения в столбцах
player_nameиyear.
Приведенный выше запрос довольно легко увидеть, что происходит, потому что мы включили оператор CASE вместе с год сама колонка. Вы можете проверить каждую строку, чтобы увидеть, соответствует ли год условию год = «SR» , а затем просмотреть результат в столбце, сгенерированном с помощью инструкции CASE .
Но что, если вам не нужны нулевые значения в столбце is_a_senior ? Следующий запрос заменяет эти нули на «нет»:
SELECT player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' THEN 'да'
ELSE 'no' END AS is_a_senior
ОТ benn.
college_football_players
Практическая задача
Напишите запрос, включающий столбец с пометкой «да», если игрок из Калифорнии, и сначала отсортируйте результаты с этими игроками.
Попробуйте См. ответ Вы также можете определить количество результатов в операторе CASE , включив любое количество операторов WHEN / THEN :
SELECT player_name,
масса,
СЛУЧАЙ, КОГДА вес > 250, ТОГДА «более 250»
КОГДА вес > 200, ТОГДА "201-250"
КОГДА вес > 175, ТОГДА '176-200'
ELSE '175 или меньше' END AS Weight_group
ОТ benn.college_football_players
В приведенном выше примере операторы WHEN / THEN будут оцениваться в том порядке, в котором они написаны. Таким образом, если значение в столбце weight данной строки равно 300, это даст результат «более 250». Вот что произойдет, если значение в столбце weight равно 180, SQL сделает следующее:
- Проверьте, больше ли
weight250.
180 не больше 250, поэтому переходите к следующему WHEN/ЗАТЕМ - Проверьте, не превышает ли
вес200. 180 не больше 200, поэтому переходите к следующемуКОГДА/ТО - Проверьте, не больше ли
weight175. 180 больше 175, поэтому запишите «175-200» в столбцеweight_group.
Несмотря на то, что все вышеперечисленное работает, на самом деле лучше всего создавать операторы, которые не перекрываются. ПРИ весе > 250 и КОГДА вес > 200 перекрываются для каждого значения больше 250, что немного сбивает с толку. Лучше написать это так:
SELECT player_name,
масса,
СЛУЧАЙ, КОГДА вес > 250, ТОГДА «более 250»
КОГДА вес > 200 И вес <= 250, ТО '201-250'
КОГДА вес > 175 И вес <= 200, ТОГДА '176-200'
ELSE '175 или меньше' END AS Weight_group
ОТ benn.college_football_players
Практическая задача
Напишите запрос, который включает имена игроков и столбец, который классифицирует их по четырем категориям в зависимости от роста.
Имейте в виду, что ответ, который мы даем, является лишь одним из многих возможных ответов, поскольку вы можете разделить рост игроков по-разному.
Вы также можете объединить несколько условных операторов с И и ИЛИ так же, как в предложении WHERE :
SELECT player_name,
СЛУЧАЙ, КОГДА год = 'FR' И позиция = 'WR', ТО 'frosh_wr'
ELSE NULL END AS sample_case_statement
ОТ benn.college_football_players
Краткий обзор основ CASE:
- Оператор
CASEвсегда находится в предложенииSELECT. -
CASEдолжен включать следующие компоненты:WHEN,THENиEND.ELSEявляется дополнительным компонентом. - Вы можете сделать любой условный оператор, используя любой условный оператор (например,
WHERE) междуWHENиTHEN.
Это включает в себя объединение нескольких условных операторов с использованием ИиИЛИ. - Вы можете включить несколько операторов
WHEN, а также операторELSEдля работы с любыми неадресованными условиями.
Практическая задача
Напишите запрос, который выбирает все столбцы из benn.college_football_players и добавляет дополнительный столбец, отображающий имя игрока, если этот игрок является младшим или старшим.
Использование CASE с агрегатными функциями
Несколько более сложная и существенно более полезная функциональность CASE достигается за счет объединения его с агрегатными функциями. Например, предположим, что вы хотите подсчитывать только те строки, которые соответствуют определенному условию. Поскольку COUNT игнорирует нули, вы можете использовать оператор CASE для оценки условия и получения нулевых или ненулевых значений в зависимости от результата:
SELECT CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END AS year_group,
COUNT(1) КАК считать
ОТ benn.
college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
ELSE 'Не FR' END
Теперь вы можете подумать: «Почему бы мне просто не использовать предложение WHERE для фильтрации строк, которые я не хочу учитывать?» Вы можете сделать это — это будет выглядеть так:
SELECT COUNT(1) AS fr_count ОТ benn.college_football_players ГДЕ год = 'FR'
Но что, если вы также хотите посчитать пару других условий? Использование предложения WHERE позволяет учитывать только одно условие. Вот пример подсчета нескольких условий в одном запросе:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО 1
Приведенный выше запрос — отличное место для использования чисел вместо столбцов в предложении GROUP BY , потому что повторение оператора CASE в предложении GROUP BY сделало бы запрос неприемлемо длинным.
Кроме того, вы можете использовать псевдоним столбца в GROUP BY предложение, подобное этому:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
ГРУППА ПО year_group
Обратите внимание: если вы решите повторить весь оператор CASE , вам следует удалить имя столбца AS year_group при копировании/вставке в GROUP BY пункт:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END
Объединение операторов CASE с агрегациями поначалу может показаться сложным.
Часто полезно сначала написать запрос, содержащий оператор CASE , а затем выполнить его самостоятельно. Используя предыдущий пример, вы можете сначала написать:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
*
ОТ benn.college_football_players
Приведенный выше запрос покажет все столбцы таблицы benn.college_football_players , а также столбец, показывающий результаты оператора CASE . Оттуда вы можете заменить * агрегацией и добавить предложение GROUP BY . Попробуйте этот процесс, если вы боретесь с любой из следующих практических проблем.
Практическая задача
Напишите запрос, который подсчитывает количество игроков весом более 300 фунтов для каждого из следующих регионов: Западное побережье (Калифорния, Орегон, Вашингтон), Техас и другие (все остальные).
Практическая задача
Напишите запрос, вычисляющий общий вес всех игроков низшего класса (FR/SO) в Калифорнии, а также общий вес всех игроков высшего класса (JR/SR) в Калифорнии.
Попробуйте См. ответИспользование CASE в агрегатных функциях
В предыдущих примерах данные отображались вертикально, но в некоторых случаях вам может понадобиться отобразить данные горизонтально. Это известно как «сводка» (как сводная таблица в Excel). Возьмем следующий запрос:
ВЫБЕРИТЕ РЕГИСТР, КОГДА год = 'FR', ТОГДА 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО 1
И переориентировать его по горизонтали:
SELECT COUNT(CASE WHEN year = 'FR' THEN 1 ELSE NULL END) AS fr_count,
COUNT (CASE WHEN year = 'SO' THEN 1 ELSE NULL END) AS so_count,
COUNT(CASE WHEN year = 'JR' THEN 1 ELSE NULL END) КАК jr_count,
COUNT (СЛУЧАЙ, КОГДА год = 'SR' THEN 1 ELSE NULL END) КАК sr_count
ОТ benn.
college_football_players
Стоит отметить, что переход от горизонтальной ориентации к вертикальной может быть значительно более сложной задачей в зависимости от обстоятельств, и более подробно она рассматривается в одном из следующих уроков.
Оттачивайте свои навыки SQL
Практические задачи
Напишите запрос, отображающий количество игроков в каждом штате, с игроками FR, SO, JR и SR в отдельных столбцах и в другом столбце для общего количества игроков. Расположите результаты так, чтобы штаты с наибольшим количеством игроков были первыми.
ПопробуйтеСмотреть ответПрактическая задача
Напишите запрос, показывающий количество игроков в школах с именами, начинающимися с букв от A до M, и количество игроков в школах с именами, начинающимися с N-Z.
ПопробуйтеСмотреть ответSQL CASE | Промежуточный SQL
Начиная здесь? Этот урок является частью полного учебника по использованию SQL для анализа данных.
Проверьте начало.
В этом уроке мы рассмотрим:
- Оператор SQL CASE
- Добавление нескольких условий в оператор CASE
- Краткий обзор основ CASE
- Использование CASE с агрегатными функциями
- Использование CASE внутри агрегатных функций
- Практические задачи
В течение следующих нескольких уроков вы будете работать с данными о футболистах колледжей. Эти данные были собраны с ESPN 15 января 2014 г. из списков, перечисленных на этой странице, с помощью парсера Python, доступного здесь. В этом конкретном уроке вы будете придерживаться информации о ростере. Эта таблица говорит сама за себя — одна строка на игрока со столбцами, описывающими атрибуты этого игрока. Запустите этот запрос, чтобы проверить необработанные данные:
ВЫБЕРИТЕ * ИЗ benn.college_football_players
Оператор CASE — это способ SQL для обработки логики if/then. За оператором CASE следует как минимум одна пара операторов WHEN и THEN — эквивалент SQL оператора IF/THEN в Excel.
Из-за этой пары у вас может возникнуть соблазн назвать это SQL CASE WHEN , но CASE является принятым термином.
Каждый оператор CASE должен заканчиваться цифрой 9.0029 КОНЕЦ заявление. Оператор ELSE является необязательным и предоставляет способ захвата значений, не указанных в операторах WHEN / THEN . CASE проще всего понять в контексте примера:
SELECT player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' THEN 'да'
ELSE NULL END AS is_a_senior
ОТ benn.college_football_players
Проще говоря, вот что происходит:
-
Оператор CASEпроверяет каждую строку на предмет истинности условного оператора —year = 'SR'. - Для любой заданной строки, если это условное выражение истинно, слово «да» печатается в столбце, который мы назвали
is_a_senior. - В любой строке, для которой условное выражение ложно, ничего не происходит в этой строке, оставляя нулевое значение в столбце
is_a_senior.
- В то же время, когда все это происходит, SQL извлекает и отображает все значения в
player_nameигодстолбцов.
Приведенный выше запрос довольно легко увидеть, что происходит, потому что мы включили оператор CASE вместе с самим столбцом year . Вы можете проверить каждую строку, чтобы увидеть, соответствует ли год условию год = «SR» , а затем просмотреть результат в столбце, сгенерированном с помощью инструкции CASE .
Но что, если вам не нужны нулевые значения в is_a_senior 9столбец 0030? Следующий запрос заменяет эти нули на «нет»:
SELECT player_name,
год,
СЛУЧАЙ, КОГДА год = 'SR' THEN 'да'
ELSE 'no' END AS is_a_senior
ОТ benn.college_football_players
Практическая задача
Напишите запрос, включающий столбец с пометкой «да», если игрок из Калифорнии, и сначала отсортируйте результаты с этими игроками.
Вы также можете определить количество результатов в Оператор CASE , включив любое количество операторов WHEN / THEN :
SELECT player_name,
масса,
СЛУЧАЙ, КОГДА вес > 250, ТОГДА «более 250»
КОГДА вес > 200, ТОГДА "201-250"
КОГДА вес > 175, ТОГДА '176-200'
ELSE '175 или меньше' END AS Weight_group
ОТ benn.college_football_players
В приведенном выше примере операторы WHEN / THEN будут оцениваться в том порядке, в котором они написаны. Итак, если значение в вес столбца данной строки равен 300, это даст результат «более 250». Вот что произойдет, если значение в столбце weight равно 180, SQL сделает следующее:
- Проверьте, больше ли
weight250. 180 не больше 250, поэтому переходите к следующемуКОГДА/ТО - Проверьте, не превышает ли
вес200.
180 не больше 200, поэтому переходите к следующему КОГДА/ЗАТЕМ - Проверьте, не больше ли
weight175. 180 больше 175, поэтому запишите «175-200» в столбцеweight_group.
Несмотря на то, что все вышеперечисленное работает, на самом деле лучше всего создавать операторы, которые не перекрываются. КОГДА вес > 250 и КОГДА вес > 200 перекрываются для каждого значения больше 250, что немного сбивает с толку. Лучше написать это так:
SELECT player_name,
масса,
СЛУЧАЙ, КОГДА вес > 250, ТОГДА «более 250»
КОГДА вес > 200 И вес <= 250, ТО '201-250'
КОГДА вес > 175 И вес <= 200, ТОГДА '176-200'
ELSE '175 или меньше' END AS Weight_group
ОТ benn.college_football_players
Практическая задача
Напишите запрос, который включает имена игроков и столбец, который классифицирует их по четырем категориям в зависимости от роста.
Имейте в виду, что ответ, который мы даем, является лишь одним из многих возможных ответов, поскольку вы можете разделить рост игроков по-разному.
Вы также можете объединить несколько условных операторов с И и ИЛИ так же, как в ГДЕ 9Предложение 0030:
ВЫБЕРИТЕ player_name,
СЛУЧАЙ, КОГДА год = 'FR' И позиция = 'WR', ТО 'frosh_wr'
ELSE NULL END AS sample_case_statement
ОТ benn.college_football_players
Краткий обзор основ CASE:
- Оператор
CASEвсегда находится в предложенииSELECT. -
CASEдолжен включать следующие компоненты:WHEN,THENиEND.ELSEявляется дополнительным компонентом. - Вы можете сделать любой условный оператор, используя любой условный оператор (например,
WHERE) междуWHENиTHEN.
Это включает в себя объединение нескольких условных операторов с использованием ИиИЛИ. - Вы можете включить несколько операторов
WHEN, а также операторELSEдля работы с любыми неадресованными условиями.
Практическая задача
Напишите запрос, который выбирает все столбцы из benn.college_football_players и добавляет дополнительный столбец, в котором отображается имя игрока, если этот игрок является младшим или старшим.
Использование CASE с агрегатными функциями
Несколько более сложная и существенно более полезная функциональность CASE достигается за счет объединения его с агрегатными функциями. Например, предположим, что вы хотите подсчитывать только те строки, которые соответствуют определенному условию. Поскольку COUNT игнорирует нули, вы можете использовать Оператор CASE для оценки условия и получения нулевых или ненулевых значений в зависимости от результата:
SELECT CASE WHEN year = 'FR' THEN 'FR'
ELSE 'Not FR' END AS year_group,
COUNT(1) КАК считать
ОТ benn.
college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
ELSE 'Не FR' END
Теперь вы можете подумать: «Почему бы мне просто не использовать предложение WHERE для фильтрации строк, которые я не хочу учитывать?» Вы могли бы сделать это — это выглядело бы так:
ВЫБРАТЬ СЧЕТЧИК(1) КАК fr_count ОТ benn.college_football_players ГДЕ год = 'FR'
Но что, если вы также хотите посчитать пару других условий? Использование предложения WHERE позволяет учитывать только одно условие. Вот пример подсчета нескольких условий в одном запросе:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО 1
Приведенный выше запрос — отличное место для использования чисел вместо столбцов в предложении GROUP BY , потому что повторение оператора CASE в предложении GROUP BY сделало бы запрос неприемлемо длинным.
В качестве альтернативы вы можете использовать псевдоним столбца в предложении GROUP BY следующим образом:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
ГРУППА ПО year_group
Обратите внимание, что если вы решите повторить весь оператор CASE , вам следует удалить имя столбца AS year_group при копировании/вставке в предложение GROUP BY :
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END
Объединение операторов CASE с агрегациями поначалу может показаться сложным.
Часто полезно сначала написать запрос, содержащий оператор CASE , а затем выполнить его самостоятельно. Используя предыдущий пример, вы можете сначала написать:
SELECT CASE WHEN year = 'FR' THEN 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
*
ОТ benn.college_football_players
Приведенный выше запрос покажет все столбцы таблицы benn.college_football_players , а также столбец, показывающий результаты оператора CASE . Оттуда вы можете заменить * агрегацией и добавить предложение GROUP BY . Попробуйте этот процесс, если вы боретесь с любой из следующих практических проблем.
Практическая задача
Напишите запрос, который подсчитывает количество игроков весом более 300 фунтов для каждого из следующих регионов: Западное побережье (Калифорния, Орегон, Вашингтон), Техас и другие (все остальные).
Практическая задача
Напишите запрос, вычисляющий общий вес всех игроков низшего класса (FR/SO) в Калифорнии, а также общий вес всех игроков высшего класса (JR/SR) в Калифорнии.
Попробуйте См. ответИспользование CASE в агрегатных функциях
В предыдущих примерах данные отображались вертикально, но в некоторых случаях вам может понадобиться отобразить данные горизонтально. Это известно как «сводка» (как сводная таблица в Excel). Возьмем следующий запрос:
ВЫБЕРИТЕ РЕГИСТР, КОГДА год = 'FR', ТОГДА 'FR'
КОГДА год = «ТАК», ТОГДА «ТАК»
КОГДА год = 'JR', ТОГДА 'JR'
КОГДА год = 'SR', ТОГДА 'SR'
ELSE 'Нет данных за год' END AS year_group,
COUNT(1) КАК считать
ОТ benn.college_football_players
СГРУППИРОВАТЬ ПО 1
И переориентировать его по горизонтали:
SELECT COUNT(CASE WHEN year = 'FR' THEN 1 ELSE NULL END) AS fr_count, COUNT (CASE WHEN year = 'SO' THEN 1 ELSE NULL END) AS so_count, COUNT(CASE WHEN year = 'JR' THEN 1 ELSE NULL END) КАК jr_count, COUNT (СЛУЧАЙ, КОГДА год = 'SR' THEN 1 ELSE NULL END) КАК sr_count ОТ benn.


college_football_players
180 не больше 250, поэтому переходите к следующему
Это включает в себя объединение нескольких условных операторов с использованием
college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
ELSE 'Не FR' END
college_football_players

180 не больше 200, поэтому переходите к следующему
Это включает в себя объединение нескольких условных операторов с использованием
college_football_players
СГРУППИРОВАТЬ ПО РЕГИСТРУ, КОГДА год = 'FR', ТОГДА 'FR'
ELSE 'Не FR' END
