функция sql pivot для таблицы только с 2 столбцами

#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 |