переставить стол - PullRequest
       7

переставить стол

0 голосов
/ 23 октября 2018

У меня есть такая таблица:

ID    Country       InternetTLD       CallingCode
1     Nicaragua      .ni                +505
2     USA            .us                +1
3     Spain          .es                +34
4     Germany        .de                +49

и мне нужен такой результат

  1           2         3         4
Nicaragua     USA      Spain     Germany
  .ni         .us       .es        .de
 +505          +1        +34       +49

Я пробовал с помощью pivot, но мне просто нужно преобразовать одну строку столбца,но в этом случае для каждой строки в первой таблице это должен быть столбец в итоговой таблице.

это мой код:

Create table #SampleTable (
ID int,
Country nvarchar(50),
InternetTLD nvarchar(50),
CallingCode nvarchar(50)
);

insert into #SampleTable (ID, Country, InternetTLD, CallingCode)
values
(1, 'Nicaragua', '.ni', '+505'),
(2, 'USA', '.us', '+505'),
(3, 'Spain', '.es', '+34'),
(4, 'Germany', '.de', '+49')




DECLARE @DynamicPivotQuery AS NVARCHAR(MAX)
DECLARE @ColumnName AS NVARCHAR(MAX)
declare @PivotSelectColumnNames AS NVARCHAR(MAX)

--Get distinct values of the PIVOT Column 
SELECT @ColumnName= ISNULL(@ColumnName + ',','') 
       + QUOTENAME(ID)
FROM (SELECT ID FROM #SampleTable ) AS ID

--Get distinct values of the PIVOT Column with isnull
SELECT @PivotSelectColumnNames 
    = ISNULL(@PivotSelectColumnNames + ',','')
    + 'ISNULL(' + QUOTENAME(ID) + ', 0) AS '
    + QUOTENAME(ID)
FROM (SELECT ID FROM #SampleTable ) AS ID

--Prepare the PIVOT query using the dynamic 
SET @DynamicPivotQuery = 
  N'SELECT  ' + @PivotSelectColumnNames + '
    FROM #SampleTable 
    PIVOT(MAX(Country) 
          FOR ID IN (' + @ColumnName + ')) AS PVTTable '

--Execute the Dynamic Pivot Query
EXEC sp_executesql @DynamicPivotQuery

DROP TABLE #SampleTable

1 Ответ

0 голосов
/ 23 октября 2018

Вам нужно pivot & unpivot, так что я бы сделал это с условным агрегированием & apply:

select max(case when id = 1 then val end) as [1], 
       max(case when id = 2 then val end) as [2], 
       max(case when id = 3 then val end) as [3],
       max(case when id = 4 then val end) as [4]
from table t cross apply
     ( values ('Country', Country, 1), ('InternetTLD', InternetTLD, 2), ('CallingCode', CallingCode, 3)  
     ) tt(col, val)
group by col, seq
order by seq;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...