Преобразование строк в столбцы
Часть раздела Продвинутый уровень путешествия по SQL на Coddy — урок 14 из 27.
Сочетайте условную агрегацию с GROUP BY, чтобы превратить строки в столбцы. Это SQL-версия сводной таблицы из электронных таблиц.
Предположим, что sales содержит строки вида (month, product, units). Чтобы увидеть по одной строке на каждый месяц с отдельным столбцом для каждого продукта:
SELECT
month,
SUM(CASE WHEN product = 'A' THEN units ELSE 0 END) AS product_a,
SUM(CASE WHEN product = 'B' THEN units ELSE 0 END) AS product_b
FROM sales
GROUP BY monthГруппа GROUP BY, которую видит каждое выражение SUM(CASE …), — это строки за один месяц; CASE выбирает срез для одного продукта.
Задание
ЛегкоДоступные таблицы и столбцы:
<strong>sales</strong>:<strong>month</strong>,<strong>product</strong>,<strong>units</strong>
Разверните данные так, чтобы каждая строка представляла собой один month со следующими столбцами:
monthapples: общее количествоunitsдля продукта'apples'за этот месяцbananas: то же самое для'bananas'cherries: то же самое для'cherries'total: общее количествоunitsпо всем продуктам за этот месяц
Верните только те месяцы, в которых total составляет не менее 20. Отсортируйте по month.
Шпаргалка
Используйте условную агрегацию с GROUP BY для преобразования строк в столбцы:
SELECT
month,
SUM(CASE WHEN product = 'A' THEN units ELSE 0 END) AS product_a,
SUM(CASE WHEN product = 'B' THEN units ELSE 0 END) AS product_b,
SUM(units) AS total
FROM sales
GROUP BY month
HAVING SUM(units) >= threshold
ORDER BY monthКаждый SUM(CASE …) суммирует только те строки, которые соответствуют этому продукту внутри каждой группы GROUP BY.
Попробуйте сами
SELECT month,
-- по одному SUM(CASE ...) на продукт, плюс общая сумма
FROM sales
GROUP BY month
-- отфильтровать месяцы, где total >= 20
ORDER BY month
В этом уроке есть небольшой тест. Начните урок, чтобы ответить на вопросы и сохранить прогресс.