#sql #sql-server #pivot
#sql-сервер #сводная
Вопрос:
Я пытаюсь использовать функцию pivot в SQL Server для преобразования некоторых результатов, но у меня возникают проблемы.
В таблице всего 2 столбца, которые выглядят следующим образом:
company category
----- -----
company 1 Arcade
company 1 Action
company 2 Arcade
company 2 Adventure
Я хотел бы преобразовать ее в это:
company category 1 category 2
----- ----- -----
company 1 Arcade Action
company 2 Arcade Adventure
Пока все, что я могу найти, — это примеры сводных функций, где в исходных результатах есть 3-й столбец с «категорией 1» или «категорией 2», который затем использует значения в этих столбцах в качестве имен новых сводных столбцов.
То, что я хочу сделать, это просто определить имена столбцов с нуля. Есть ли способ сделать это с помощью функции pivot?
Заранее спасибо!
Ответ №1:
Поскольку вам нужен третий столбец, содержащий category1
, category2
и т.д., Я бы предложил сначала применить к вашим данным функцию управления окнами, такую row_number()
, прежде чем пытаться преобразовать данные в столбцы. row_number()
Функция создаст уникальный порядковый номер для каждого из них, company
и category
затем вы будете использовать это вычисленное значение для преобразования данных.
Самый простой способ преобразовать данные — использовать агрегатную функцию вместе с выражением CASE. Во-первых, вы будете использовать подзапрос для генерации row_number()
:
select company,
max(case when seq = 1 then category end) Category1,
max(case when seq = 2 then category end) Category2
from
(
select company, category,
row_number() over(partition by company
order by company) seq
from yourtable
) d
group by company;
Смотрите SQL Fiddle с демонстрацией.
Теперь, если вы хотите использовать функцию PIVOT, вы все равно будете использовать row_number()
, но вы бы поместили новую вычисляемую последовательность в качестве новых имен столбцов:
select company, category1, category2
from
(
select company, category,
'category'
cast(row_number() over(partition by company
order by company) as varchar(10)) seq
from yourtable
) d
pivot
(
max(category)
for seq in (Category1, Category2)
) piv;
Смотрите SQL Fiddle с демонстрацией. Они генерируют результат:
| COMPANY | CATEGORY1 | CATEGORY2 |
|-----------|-----------|-----------|
| company 1 | Arcade | Action |
| company 2 | Arcade | Adventure |