0Pricing
SQL Academy · Урок

Группировка и маркировка данных

Превращайте значения в категории

«Группировка и маркировка данных» — бесплатный урок SQL Academy на CoddyKit. Это урок 3 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения SQL Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс SQL Academy содержит 4 уроков всего.

Что такое разбиение на категории

Разбиение на категории означает объединение исходных значений в именованные категории — преобразование чисел, дат или кодов в понятные человеку метки.

Вместо оценки 87 вы показываете "Хорошо". Вместо возраста 14 вы показываете "Подросток". Ваш главный инструмент для этого — выражение CASE.

Пример таблицы: заказы

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

Выполните приведённый ниже запрос, чтобы увидеть данные, с которыми мы работаем.

SELECT id, customer, amount, status
FROM orders
ORDER BY id;

Добавление меток с помощью CASE WHEN

Самый простой способ разбить значения на категории — проверить условие и назначить метку. Блок CASE WHEN ... THEN ... ELSE ... END возвращает новую строку для каждой строки.

Здесь мы обозначаем каждый заказ как 'Большой' или 'Маленький' в зависимости от его суммы.

SELECT id,
       amount,
       CASE
         WHEN amount >= 500 THEN 'Large'
         ELSE 'Small'
       END AS order_size
FROM orders;

Несколько категорий с цепочками WHEN

Можно добавить столько предложений WHEN, сколько необходимо. SQL проверяет их сверху вниз и останавливается на первом совпадении.

В этом примере суммы разделены на три уровня: маленькие, средние и большие.

SELECT id,
       amount,
       CASE
         WHEN amount < 100  THEN 'Small'
         WHEN amount < 500  THEN 'Medium'
         ELSE 'Large'
       END AS order_tier
FROM orders;

Разбиение текстовых значений на категории

Категории предназначены не только для чисел. Можно сопоставлять точные текстовые значения и заменять их более понятными метками.

Здесь исходные коды состояния 'P', 'S' и 'C' превращаются в понятные слова.

SELECT id,
       status,
       CASE status
         WHEN 'P' THEN 'Pending'
         WHEN 'S' THEN 'Shipped'
         WHEN 'C' THEN 'Cancelled'
         ELSE 'Unknown'
       END AS status_label
FROM orders;

Использование простой формы CASE

Когда вы сравниваете один столбец с несколькими фиксированными значениями, простая форма CASE (CASE column WHEN value ...) короче и понятнее, чем повторение имени столбца в каждом предложении WHEN.

Результат будет тем же, что и при использовании поисковой формы.

SELECT id,
       CASE status
         WHEN 'P' THEN 'Pending'
         WHEN 'S' THEN 'Shipped'
         WHEN 'C' THEN 'Cancelled'
         ELSE 'Unknown'
       END AS status_label
FROM orders;

Разбиение на категории внутри GROUP BY

Получив метку категории, можно сгруппировать строки по ней и подсчитать, сколько строк относится к каждой категории. Оберните всё выражение CASE в GROUP BY.

Этот запрос показывает, сколько заказов относится к маленьким, средним и большим.

SELECT
  CASE
    WHEN amount < 100  THEN 'Small'
    WHEN amount < 500  THEN 'Medium'
    ELSE 'Large'
  END AS order_tier,
  COUNT(*) AS total_orders
FROM orders
GROUP BY
  CASE
    WHEN amount < 100  THEN 'Small'
    WHEN amount < 500  THEN 'Medium'
    ELSE 'Large'
  END;

Разбиение на категории с псевдонимом подзапроса

Повторять длинный блок CASE в GROUP BY многословно. Более аккуратный подход — обернуть основной запрос в подзапрос (или CTE), чтобы напрямую обращаться к псевдониму.

SELECT order_tier, COUNT(*) AS total_orders
FROM (
  SELECT
    CASE
      WHEN amount < 100  THEN 'Small'
      WHEN amount < 500  THEN 'Medium'
      ELSE 'Large'
    END AS order_tier
  FROM orders
) AS bucketed
GROUP BY order_tier;

Числовые категории: возрастные группы

Группировка по возрасту — классический пример использования разбиения на категории. Приведённый ниже запрос назначает каждому клиенту именованную возрастную группу.

Обратите внимание, что условия идут от меньшего к большему: SQL останавливается на первом истинном WHEN, поэтому порядок имеет значение.

SELECT name,
       age,
       CASE
         WHEN age < 13 THEN 'Child'
         WHEN age < 18 THEN 'Teen'
         WHEN age < 65 THEN 'Adult'
         ELSE 'Senior'
       END AS age_group
FROM customers;

Добавление меток NULL в категории

Если значение равно NULL, ни одно условие WHEN (кроме IS NULL) не сопоставится с ним. Без явной проверки значения NULL перейдут в ветвь ELSE.

Добавьте предложение WHEN column IS NULL, чтобы назначить значениям NULL отдельную метку.

SELECT id,
       amount,
       CASE
         WHEN amount IS NULL THEN 'No Data'
         WHEN amount < 100   THEN 'Small'
         WHEN amount < 500   THEN 'Medium'
         ELSE 'Large'
       END AS order_tier
FROM orders;

Разбиение на категории в ORDER BY

Вы также можете использовать выражение CASE непосредственно внутри ORDER BY, чтобы управлять приоритетом сортировки без добавления нового столбца.

Приведённый ниже пример всегда выводит сначала ожидающие заказы, затем отправленные и затем отменённые.

SELECT id, customer, status
FROM orders
ORDER BY
  CASE status
    WHEN 'P' THEN 1
    WHEN 'S' THEN 2
    WHEN 'C' THEN 3
    ELSE 4
  END;

Быстрая проверка

Проверьте, насколько хорошо вы понимаете разбиение данных на категории и добавление меток с помощью CASE.

Итоги урока

Отличная работа! Вот что вы изучили о разбиении данных на категории и добавлении меток:

  • Разбиение на категории преобразует исходные значения в именованные категории с помощью CASE WHEN.
  • Цепочки предложений WHEN создают несколько категорий; SQL останавливается на первом совпадении.
  • Простая форма CASE (CASE col WHEN val) идеально подходит для сравнения одного столбца с фиксированными значениями.
  • Можно выполнить GROUP BY по выражению CASE, чтобы подсчитать строки в каждой категории.
  • Всегда обрабатывайте NULL явно с помощью WHEN col IS NULL, чтобы назначить ему понятную метку.
  • CASE также работает внутри ORDER BY, позволяя задать собственный приоритет сортировки.

Разбиение на категории делает отчёты гораздо понятнее, заменяя исходные коды и числа ясными описательными метками.

Часто задаваемые вопросы

Урок «Группировка и маркировка данных» бесплатный?

Да — полный текст урока «Группировка и маркировка данных» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс SQL Academy, подпишись на CoddyKit PRO. Курс SQL Academy содержит 4 уроков всего.

Чему я научусь в уроке «Группировка и маркировка данных»?

Превращайте значения в категории Ты практикуешь SQL Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать SQL Academy?

Предыдущий опыт не требуется. SQL Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 3 из 4.

Сколько времени занимает урок «Группировка и маркировка данных»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке SQL Academy?

Да. Каждый урок SQL Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Выражение CASE
  2. Поисковый и простой CASE
  3. Группировка и маркировка данных
  4. CASE в ORDER BY и агрегатах
← Назад к SQL Academy