Представьте, что SQL Pivot — кубик Рубика для data-анализа. Он может крутить и переворачивать ваши данные, предлагая свежий взгляд на них.
SQL Pivot — это реляционный оператор, который преобразует данные с уровня строк на уровень столбцов. Магия SQL Pivot заключается в его способности вращать выражение с табличным значением. Уникальные значения превращаются из одного указанного столбца в несколько столбцов на выходе. Агрегация происходит там, где это необходимо.
В этой статье мы подробно рассмотрим концепцию SQL Pivot. Вы узнаете принципы этой техники, ее практическое применение, а также как ее можно использовать для улучшения читаемости и анализа данных.
Понимание Pivot в SQL Server
SQL Pivot — это мощный инструмент, используемый в SQL Server для поворота табличных выражений, преобразования строк в столбцы и выполнения агрегации по определенным столбцам.
Операцию превращения уникальных значений строк в одном столбце в несколько поворотных столбцов на выходе еще называют перекрестной табуляцией.
Перекрестная табуляция особенно полезна, когда необходимо преобразовать данные из нормализованного или «неповоротного» формата в поворотный. Это часто облегчает их понимание и анализ.
Перекрестная табуляция полезна еще при работе с большими наборами данных, которые требуют организации и обобщения данных.
Вы можете использовать SQL Pivot в SQL Server и Oracle. В PostgreSQL и MySQL для достижения того же результата может потребоваться использование нескольких операторов в комбинации.
Во всех этих системах управления базами данных (СУБД) синтаксис более или менее схож, поэтому мы больше сосредоточимся на функциональности, чем на различиях в синтаксисе.
Если вы хотите узнать еще глубже погрузиться в SQL и узнать, как применять искусственный интеллект в аналитике, регистрируйтесь на бесплатный онлайн-практикум «Профессия аналитик данных в эпоху ChatGPT». Вы получите не только практические знания, но и приятные подарки за участие.

- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросети DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ
- Где и как применять? Потестируем модель после установки на разных задачах
- Как дообучить модель под себя?
Синтаксис оператора Pivot
Оператор PIVOT работает, превращая уникальные значения в одном столбце в несколько столбцов на выходе и выполняя заданные функции агрегирования (такие как SUM, COUNT, AVG и т. д.) над оставшимися значениями столбцов.
Основной синтаксис для использования Pivot в SQL Server выглядит следующим образом:
SELECT ...
FROM ...
PIVOT (aggregate_function(column_to_be_aggregated)
FOR column_to_be_pivoted
IN (list_of_values))Обратите внимание, что вся операция PIVOT заключена в круглые скобки и является частью предложения FROMзапроса. Список значений, указанный в предложении IN, должен быть исчерпывающим и статичным.
Например, рассмотрим следующий пример таблицы Sales:
В приведенном выше примере запрос вернет набор результатов, в котором каждому товару отведена отдельная строка, а продажи за каждый год показаны в отдельных столбцах.
Рассмотрим другой пример. Предположим, у нас есть таблица Scores, в которой хранятся оценки студентов по различным предметам:
Вот запрос SQL Server PIVOT, который нужно использовать:
SELECT StudentID, [Math], [English]
FROM
(
SELECT StudentID, Subject, Score
FROM Scores
) AS SourceTable
PIVOT
(
SUM(Score)
FOR Subject IN ([Math], [English])
) AS PivotTable;Результатом вышеприведенного запроса будет:
Этот SQL-запрос предоставит сводную информацию о баллах, полученных каждым студентом по предметам «Математика» и «Английский язык».
Для каждого уникального идентификатора студента будет создана строка. В этой строке будут два столбца для математики и английского языка. Значения в этих столбцах будут представлять собой общие баллы (суммированные, если записей несколько), которые соответствующий студент набрал по этим предметам.
Теперь рассмотрим основы Pivot-таблиц (сводных таблиц) и распространенные сценарии их использования.
Pivot-таблицы: необходимые основы
В SQL Server Pivot-таблица (сводная таблица) — это функция или концепция, позволяющая менять отображение данных со строк на столбцы.
По сути, Pivot-таблица — это часть обобщенной информации, которая генерируется из большого базового набора данных. Как правило, она используется для представления конкретных измерений с точки зрения данных.
Некоторые распространенные сценарии использования таблиц Pivot включают:
- Обобщение данных о продажах по регионам, продуктам или клиентам.
- Агрегирование данных по времени, например ежемесячных или ежегодных отчетов.
- Сравнение данных по различным категориям (например, мужчины против женщин, новые клиенты против вернувшихся и т. д.).
Создание сводной таблицы в SQL обычно включает следующие шаги:
- Начните с выбора базового набора данных для сводной таблицы.
- Определите столбцы, которые будут отображаться в выходных данных.
- Укажите столбец для разворота и функцию агрегирования, которая будет применяться.
Вот пример SQL-запроса, который создает сводную таблицу:
SELECT EmployeeID, [2023-07-01], [2023-07-02]
FROM
(
SELECT EmployeeID, WorkDate, Hours
FROM EmployeeHours
) AS SourceTable
PIVOT
(
SUM(Hours)
FOR WorkDate IN ([2023-07-01], [2023-07-02])
) AS PivotTable;В приведенном выше примере результат показывает общее количество часов, отработанных каждым сотрудником в указанные даты, в виде Pivot-таблицы.
Теперь перейдем к тому, как подготовить данные для работы со сводными таблицами.
Что такое оператор UNPIVOT?
В Microsoft SQL Server оператор UNPIVOT выполняет обратную операцию PIVOT. Это помогает при анализе данных, особенно когда необходимо преобразовать столбцы в строки для более удобной интерпретации и представления.
Если оператор PIVOT преобразует данные по строкам в данные по столбцам, то оператор UNPIVOT берет данные по столбцам и преобразует их в данные по строкам в новой сводной таблице.
Синтаксис команды UNPIVOT выглядит следующим образом:
SELECT ... FROM ...
UNPIVOT
(
[new_column_name] FOR [existing_column_name] IN (column_list)
) AS UnpivotTable;Также можно посмотреть на приведенный выше запрос следующим образом:
SELECT <non-pivoted column>, [<list of pivoted columns>]
FROM (<SELECT query to produce the data>) AS <alias for the source query>
UNPIVOT (<column to be turned into multiple rows>
FOR [<column that will be converted>]
IN (<list of columns to unpivot>)
) AS <alias for the unpivot table>При повороте выбор агрегатной функции зависит от характера данных и результата, который нужен.
Если в каждой комбинации строк и столбцов для разворота есть только одно значение, то можно использовать SUM, MAX или MIN. Они возвращают исходное значение при одном входе.
Когда использовать UNPIVOT?
UNPIVOT полезен, когда у вас есть денормализованная структура данных, которую нужно нормализовать. Если у вас есть таблица, в которой часть данных хранится в виде заголовков столбцов, вы можете использовать UNPIVOTдля преобразования этих столбцов в строки.
Оператор UNPIVOT чаще всего используется, когда необходимо нормализовать результат запроса. Это может произойти, если данные изначально представлены в ненормализованном или «широком» формате, с отдельными столбцами для связанных точек данных. Тогда было бы эффективнее организовать эти точки данных в строки под одним столбцом.
Например, рассмотрим таблицу, в которой записаны данные о продажах за месяц с отдельными столбцами для каждого месяца. Если вы хотите проанализировать общий объем продаж за все месяцы, будет проще сделать это, когда все показатели продаж будут перечислены в строках в одном столбце «Продажи», а не распределены по нескольким столбцам «Месяц».
В этом случае можно использовать оператор UNPIVOT, чтобы преобразовать данные в этот более удобный для анализа формат.
Вот сценарий, в котором показаны две таблицы и код для них, который можно использовать для создания таблицы Pivot, показывающей данные по годам из примера таблицы Sales:
В приведенном выше примере столбец Month будет содержать название месяца, а столбец Sales — количество продаж за этот месяц.
Чтобы убедиться, что синтаксис и JOIN отточены с помощью команды или подсказки в AI, можно использовать ChatGPT.
Как использовать динамические сводные таблицы для преобразования данных
В SQL Server динамические сводные таблицы и динамические столбцы пригодятся, когда нужно преобразовать или повернуть данные из нормализованного формата набора данных в более удобный для чтения формат. Особенно если столбцы, которые вы хотите создать, заранее неизвестны.
Типичная операция PIVOT в SQL Server требует явного перечисления значений, которые вы хотите превратить в столбцы. Но когда у вас есть большое количество разных значений или когда эти значения постоянно меняются, ручное обновление запроса PIVOT становится нецелесообразным. Здесь пригодится динамический SQL.
Динамический SQL — это технология программирования, которая позволяет динамически создавать SQL-запросы во время выполнения. Она особенно полезна, когда нужно создать SQL-запрос на основе переменных, которые неизвестны до момента выполнения.
С помощью динамического SQL можно создать динамический запрос Pivot, в котором имена столбцов определяются при выполнении. Вот пример:
DECLARE @columns NVARCHAR(MAX), @sql NVARCHAR(MAX);
-- Get the list of unique values for the pivot column
SELECT @columns = COALESCE(@columns + ', ', '') + QUOTENAME(ColumnName)
FROM (SELECT DISTINCT ColumnName FROM YourTable) x;
-- Construct the dynamic pivot query
SET @sql = '
SELECT *
FROM YourTable
PIVOT (
SUM(ValueColumn)
FOR ColumnName IN (' + @columns + ')
) p';
-- Execute the dynamic pivot query
EXEC sp_executesql @sql;В этом примере @columns — переменная, содержащая динамически созданный список имен столбцов, а @sql — переменная, содержащая окончательный запрос разворота. Хранимая процедура sp_executesql используется для выполнения этого динамического разворотного запроса.
В результате будет получен набор результатов, содержащий столбец для каждого уникального года в таблице Sales и строку для каждого продукта с общей суммой продаж для этого продукта в каждом году.
Обратите внимание, что это упрощенный пример, а реальное использование зависит от ваших конкретных требований и схемы базы данных. Чтобы проиллюстрировать то, что мы имеем в виду, рассмотрим четыре примера динамического SQL в действии.
1. Динамический ORDER BY
Если вы хотите динамически упорядочить набор результатов Pivot-данных на основе имени столбца, которое будет известно только при выполнении.
DECLARE @OrderByColumn NVARCHAR(128) = 'Year'; -- This can be any column of your table
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM Sales ORDER BY ' + QUOTENAME(@OrderByColumn);
EXEC sp_executesql @sql;Вот как можно использовать его в реальном примере таблицы в базе данных SQL-сервера:
На выходе вы увидите данные из вышеупомянутой функции Pivot, упорядоченные по годам:
2. Динамический WHERE
Аналогично динамическому ORDER BY, вам также может потребоваться динамическое выражение WHERE.
DECLARE @FilterColumn NVARCHAR(128) = 'Year'; -- This can be any column of your table
DECLARE @FilterValue INT = 2021;
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM Sales WHERE ' + QUOTENAME(@FilterColumn) + ' = @FilterValue';
EXEC sp_executesql @sql, N'@FilterValue INT', @FilterValue;3. Динамический JOIN
В некоторых случаях вам может понадобиться динамическое объединение таблиц. Вот как это можно сделать:
DECLARE @JoinTable NVARCHAR(128) = 'Product'; -- This can be any table in your database
DECLARE @JoinOnColumn NVARCHAR(128) = 'ProductID'; -- This can be any column of your table
DECLARE @sql NVARCHAR(MAX);
SET @sql = N'SELECT * FROM Sales JOIN ' + QUOTENAME(@JoinTable) +
' ON Sales.' + QUOTENAME(@JoinOnColumn) + ' = ' +
QUOTENAME(@JoinTable) + '.' + QUOTENAME(@JoinOnColumn);
EXEC sp_executesql @sql;В приведенном выше примере результат вернет представление объединенной таблицы на основе ProductID.
4. Динамическое переименование столбцов
Могут возникнуть ситуации, когда необходимо динамически переименовывать столбцы на основе определенных условий или значений. В SQL Server этого можно добиться с помощью комбинации конкатенации строк и системных функций. (Конкатенация — процесс объединения двух или более строковых значений в одно.)
Пример:
DECLARE @Year NVARCHAR(4);
SET @Year = CAST(YEAR(GETDATE()) AS NVARCHAR(4));
DECLARE @sql NVARCHAR(MAX);
SET @sql = 'ALTER TABLE Sales RENAME COLUMN Amount TO Amount_' + @Year;
EXEC sp_executesql @sql;Как использовать это на примере таблицы Sales:
Продвинутые техники и советы по использованию SQL Pivot
Повороты в SQL могут становиться все более сложными при использовании продвинутых техник. Освоение этих концепций позволит вам создавать более сложные отчеты, манипулировать данными и с легкостью выполнять преобразования данных.
1. Оператор CASE с агрегатными функциями
Если ваша версия SQL не поддерживает ключевое слово PIVOT или вам нужна большая гибкость, вы можете использовать комбинацию выражений оператора CASE и агрегатных функций, таких как MIN, MAX или AVG, для достижения аналогичных результатов.
Этот метод будет работать в различных диалектах SQL и обеспечит больший контроль над агрегированием данных. Как это сделать на примере следующего запроса:
SELECT
year,
SUM(CASE WHEN month = 1 THEN value END) AS Jan,
SUM(CASE WHEN month = 2 THEN value END) AS Feb,
-- ...
FROM sales
GROUP BY year2. Комбинирование PIVOT с JOIN
Использование INNER JOIN в сочетании с PIVOT поможет объединить связанные наборы данных по общим ключам до или после преобразования. результат улучшится, и не нужно будет проводить дополнительные манипуляции с данными.
3. Работа с датами
Поворот данных, основанных на времени, часто требует предварительной обработки. Например, извлечение определенных частей даты (день, месяц или год) из столбца DATE сделает процесс разворота более плавным.
4. Рассмотрите возможность использования временных таблиц или представлений
Чтобы упростить сложные операции PIVOT, можно разбить их на более мелкие части с помощью временных таблиц, что поможет лучше управлять входными данными и промежуточными результатами.
5. Использование VARCHAR и других типов данных в PIVOT
Помните, что агрегированное значение в PIVOT должно соответствовать типу данных идентификатора столбца. При необходимости используйте явные преобразования типов, чтобы обеспечить согласованность и избежать ошибок во время выполнения.
6. Работа с NULL-значениями
Поворот данных может привести к появлению NULL-значений в наборе результатов. Используйте функции ISNULL или COALESCE для замены NULL на значения по умолчанию или пользовательские значения для лучшего представления данных.
7. Использование курсоров для преобразования данных
Курсоры имеют некоторые недостатки в производительности по сравнению с операциями на основе набора, но в определенных сценариях использование курсора для выполнения преобразования данных по строкам может обеспечить больший контроль над процессом.
Заключительные мысли
Оператор SQL PIVOT — это мощный инструмент, который может значительно улучшить читаемость и анализ ваших данных. Преобразуя уникальные значения из одного столбца в несколько столбцов на выходе и применяя заданные функции агрегирования, он позволяет представить данные в более упорядоченном виде.
Мы рассмотрели фундаментальные принципы работы оператора SQL PIVOT и его практическое применение, а также предоставили пошаговые инструкции по его использованию.
Понимание и эффективное использование этого оператора значительно улучшит ваши задачи по управлению и анализу данных, что делает его необходимым навыком для всех, кто работает с SQL.
Мы надеемся, что эта информация дала вам прочную основу и уверенность в том, что вы сможете применить эти концепции в своей работе!
- Освой нейросеть Perplexity и узнай, как пользоваться функционалом остальных ИИ в одном
- УЧАСТВОВАТЬ ЗА 0 РУБ.
- Расскажем, как получить подписку
- ПОКАЖЕМ, КАК РАЗВЕРНУТЬ МОДЕЛЬ нейросеть DEEPSEEK R1 ПРЯМО НА СВОЁМ КОМПЬЮТЕРЕ










