В этом учебном пособии вы узнаете, как использовать оператор PIVOT в SQL Server (Transact-SQL) с синтаксисом и примерами.
Описание
Оператор PIVOT SQL Server (Transact-SQL) позволяет писать кросс-табуляцию. Это означает, что вы можете агрегировать свои результаты и поворачивать строки в столбцы.
Синтаксис
Синтаксис предложения PIVOT в SQL Server (Transact-SQL):
[pivot_value1], [pivot_value2], ... [pivot_value_n]
FROM
(
(
aggregate_function(
FOR
) AS
Параметры или аргументы
first_column - столбец или выражение, которое будет отображаться в качестве первого столбца в сводной таблице.
first_column_alias - заголовок столбца для первого столбца в сводной таблице.
pivot_value1, pivot_value2, ... pivot_value_n - список значений для поворота.
source_table - оператор SELECT, который предоставляет исходные данные для сводной таблицы.
source_table_alias - псевдоним для source_table.
aggregate_function - агрегирующая функция, такая как SUM, COUNT, MIN, MAX или AVG.
aggregate_column - столбец или выражение, которое будет использоваться с aggregate_function.
pivot_column - столбец, содержащий значения поворота.
pivot_table_alias - псевдоним для сводной таблицы.
Применение
PIVOT может использоваться в следующих версиях SQL Server (Transact-SQL):
- SQL Server 2017, SQL Server 2016, SQL Server 2014, SQL Server 2012, SQL Server 2008 R2, SQL Server 2008, SQL Server 2005
Запросы создания таблиц и данные для примеров:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
CREATE TABLE departments ( dept_id INT NOT NULL, dept_name VARCHAR(50) NOT NULL, CONSTRAINT departments_pk PRIMARY KEY (dept_id) ); CREATE TABLE employees ( employee_number INT NOT NULL, last_name VARCHAR(50) NOT NULL, first_name VARCHAR(50) NOT NULL, salary INT, dept_id INT, CONSTRAINT employees_pk PRIMARY KEY (employee_number) ); |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
INSERT INTO departments (dept_id, dept_name) VALUES (30, 'Бухгалтерия'); INSERT INTO departments (dept_id, dept_name) VALUES (45, 'Сбыт'); INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES (14012, 'Зубова', 'Рената', 54000, 45); INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES (28954, 'Маркин', 'Тибул', 80000, 45); INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES (31957, 'Скрепкин', 'Григорий', 42000, 45); INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES (41312, 'Платов', 'Роман', 57500, 30); INSERT INTO employees (employee_number, last_name, first_name, salary, dept_id) VALUES (64029, 'Корнеев', 'Иван', 65000, 30); |
Выполните скрипты для создания таблиц и для заполнения данными. Затем попробуйте примеры в вашей собственной базе данных!
Пример
Оператор PIVOT может использоваться в SQL Server (Transact-SQL).
Рассмотрим пример. Если бы у нас была таблица employees, которая содержала следующие данные:
employee_number | last_name | first_name | salary | dept_id |
---|---|---|---|---|
14012 | Зубова | Рената | 54000 | 45 |
28954 | Маркин | Тибул | 80000 | 45 |
31957 | Скрепкин | Григорий | 42000 | 45 |
41312 | Платов | Роман | 57500 | 30 |
64029 | Корнеев | Иван | 65000 | 30 |
И мы запустили следующий оператор SQL, который создает кросс-табулирующий запрос с использованием предложения PIVOT:
1 2 3 4 5 6 7 8 9 10 |
SELECT 'TotalSalary' AS TotalSalaryByDept, [30], [45] FROM (SELECT dept_id, salary FROM employees) AS SourceTable PIVOT ( SUM(salary) FOR dept_id IN ([30], [45]) ) AS PivotTable; |
Это вернет следующий результат:
TotalSalaryByDept | 30 | 45 |
---|---|---|
TotalSalary | 122500 | 176000 |
В этом примере создается сводная таблица для отображения TotalSalary (общей зарплаты) для dept_id 30 и dept_id 45. Результаты отображаются в одной строке, причем два dept_id (отдела) отображаются в каждом столбце.
Теперь давайте разобъем предложение PIVOT и объясним, как это работает.
Определение столбцов в результатах кросс-табуляции
Во-первых, мы хотим указать, какие поля включать в результаты кросс-табуляции. В этом примере мы хотим включить литеральное значение «TotalSalary» в качестве первого столбца в сводной таблице. И мы хотим создать один столбец для dept_id 30 и второй столбец для dept_id 45. Это дает нам 3 столбца в нашей сводной таблице.
1 2 |
SELECT 'TotalSalary' AS TotalSalaryByDept, [30], [45] |
Укажем данные исходной таблицы
Затем нам нужно указать оператор SELECT, который вернет исходные данные для сводной таблицы.
В этом примере мы хотим вернуть значения dept_id и salary из таблицы employees:
1 2 |
(SELECT dept_id, salary FROM employees) AS SourceTable |
Вы должны указать псевдоним для исходного запроса. В этом примере мы использовали псевдоним запроса как SourceTable.
Указать агрегирующую функцию
Затем нам нужно указать, какую агрегирующую функцию использовать при создании нашего запроса для кросс - табуляции. Вы можете использовать любую агрегирующую функцию, такую как функции SUM, COUNT, MIN, MAX или AVG.
В этом примере мы будем использовать функцию SUM. Это суммирует значения salary:
1 2 |
PIVOT (SUM(salary) |
Указать Pivot значеня
Наконец, нам нужно указать, какие pivot значения включать в наши результаты. Они будут использоваться в качестве заголовков столбцов в нашем запросе кросс-табуляции.
В этом примере мы вернем только значения dept_id 30 и 45. Эти значения станут заголовками столбцов в нашей pivot таблице. Также обратите внимание, что эти значения представляют собой конечный список значений dept_id и не обязательно будут содержать все возможные значения.
1 |
FOR dept_id IN ([30], [45]) |
Теперь, когда мы собираем все это вместе, мы получаем следующую pivot таблицу:
TotalSalaryByDept | 30 | 45 |
---|---|---|
TotalSalary | 122500 | 176000 |