В вашем примере выходных данных не ясно, почему значения из столбцов 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, которая объясняет, почему получение данных, которые вы хотите, так сложно.