В вашем примере вывода, не понятно, почему значения из столбцов 1 и 2 будут относиться к столбцам 3 и 4. Однако здесь возможно решение:
;With RowNumbers As
(
Select Id, PTypeField, Value
, Row_Number() Over(Partition By PTypeField Order By Id) As Rownum
From #Test
)
Select RowNum
, Min(Case When PTypeField = 1 Then Id End) As Id
, Min(Case When PTypeField = 1 Then Value End) As [1]
, Min(Case When PTypeField = 2 Then Id End) As Id
, Min(Case When PTypeField = 2 Then Value End) As [2]
, Min(Case When PTypeField = 3 Then Id End) As Id
, Min(Case When PTypeField = 3 Then Value End) As [3]
, Min(Case When PTypeField = 4 Then Id End) As Id
, Min(Case When PTypeField = 4 Then Value End) As [4]
From RowNumbers
Group By RowNum
Если вы хотите динамически генерировать столбцы, единственный способ сделать это в SQL - использовать некоторый динамический динамический SQL. T-SQL не был предназначен для такого типа вывода, и вместо этого вы должны использовать инструмент отчетности или выполнять кросс-табуляцию в компоненте или классе среднего уровня.
Эта схема данных выглядит как EAV, которая объясняет, почему получение данных, которые вы хотите, так сложно.
Это может привести к запуску http://stackoverflow.com/questions/1534959/sql-server-2005-pivoting-data-without-a-sum-count-and-dynamic-list-of-values –
В вашем пример вывода, как данные в столбцах 1 и 2 относятся к столбцам 3 и 4 или 5 и 6? Я., почему «D» появляется в той же строке, что и «FL», а не 'IF'? Это случайно? – Thomas