Транспонировать/повернуть строки в столбцы

Я пытаюсь транспонировать (повернуть?) таблицу. Это мои текущие настройки.
Текущая таблица:

ID | Value
1  | 10
1  | 11
1  | 12
1  | 13
1  | 14
2  | 123
3  | 13423
3  | 1134
3  | 1234

Ищем следующий результат:

ID | Value01 | Value 02 | Value 03 | Value 04 | Value 05
1  |  10     |  11      |   12     |   13     |  14
2  |  123
3  | 13423   | 1134     | 1234

В настоящее время я пробую это с PIVOT, однако я не совсем уверен, как PIVOT без «столбца категорий» (например, дней или месяцев). Могу ли я использовать для этого столбец ID?

SELECT ID, Value, [0], [1], [2], [3], [4] 
FROM (
      SELECT ID, Value FROM dbo.TABLE
) SourceTable 
PIVOT (
      VALUE FOR ID IN ([0], [1], [2], [3], [4])
) AS PivotTable

Нет заданного количества VALUE для каждого ID. Но если требуется известное число, достаточно 5 значений (и, следовательно, 5 столбцов).


person Ben Z.    schedule 29.07.2013    source источник


Ответы (1)


Ваш текущий запрос закрыт, вам не хватает значения, которое вы хотите использовать в качестве новых имен столбцов. Мое предложение состояло бы в том, чтобы использовать row_number(), который будет создавать увеличенное значение для каждого id, затем вы можете использовать функцию PIVOT, чтобы вернуть max(value) для каждого из этих последовательных значений:

SELECT ID, [0], [1], [2], [3], [4] 
FROM 
(
  SELECT ID, Value, 
    row_number() over(partition by id 
                        order by id) -1  seq
  FROM yourtable
) SourceTable 
PIVOT 
(
  max(VALUE)
  FOR seq IN ([0], [1], [2], [3], [4])
) AS PivotTable;

См. SQL Fiddle с демонстрацией.

person Taryn    schedule 29.07.2013
comment
+1 просто обратите внимание, что без дополнительного столбца для упорядочения расположение значений в каждом столбце может не соответствовать их вертикальной ориентации, как показано в вопросе. Также ура для staycations! :-) - person Aaron Bertrand; 29.07.2013
comment
Благодарю вас! Я добавил desc в row_number() .. order by .. - person Ben Z.; 29.07.2013
comment
Спасибо, Аарон, за ваш комментарий, нет необходимости в совпадении ориентаций (чистое совпадение в вопросе); пока выбрано не более 5 значений. - person Ben Z.; 29.07.2013
comment
@Ben хорошо, но также важно отметить, что мы понятия не имеем, что вы подразумеваете под максимальным 5, и что если у вас есть 6 значений, нет возможности гарантировать, какие 5 значений будут включены. Изменение ORDER BY на ORDER BY DESC не меняет этого. - person Aaron Bertrand; 29.07.2013
comment
С max 5 я имею в виду выбрать 5 самых больших значений из списка значений. Разве ORDER BY DESC не будет обеспечивать это? - person Ben Z.; 30.07.2013
comment
@БенЗ. Да, если вам нужны 5 максимальных значений, вам нужно будет использовать order by value desc в номере строки. - person Taryn; 30.07.2013