T-SQL запрос для получения следующих результатов - PullRequest
0 голосов
/ 21 мая 2018

У меня есть вопрос, с которым я столкнулся в интервью.

Не могли бы вы дать решение для этого?

enter image description here

Ответы [ 3 ]

0 голосов
/ 21 мая 2018

Попробуйте это.Это работает на моем конце.

   SELECT
    [Column1.1],[Column2.1],[Column1.2],[Column2.2],[Column1.3],[Column2.3],[Column1.4],[Column2.4]
FROM(
        SELECT 
             ColData = Table1.Column1
            ,ColName = 'Column1.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
        FROM Table1
        UNION
        SELECT 
             ColData = Table1.Column2
            ,ColName = 'Column2.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
        FROM  Table1
)AS Tab
PIVOT 
(  
    MAX(ColData)  
    FOR ColName IN ([Column1.1],[Column2.1],[Column1.2],[Column2.2],[Column1.3],[Column2.3],[Column1.4],[Column2.4])  
) AS PIV;

Выход:

enter image description here

0 голосов
/ 22 мая 2018

PIVOT с более чем одним столбцом можно сделать с условным агрегированием :

DECLARE @t TABLE ( c1 CHAR(1), c2 CHAR(3))
INSERT INTO @t VALUES
 ('A', 'AAA') 
,('B', 'BBB') 
,('C', 'CCC') 
,('D', 'DDD');

WITH Numbered AS
(
    SELECT *
          ,ROW_NUMBER() OVER(ORDER BY c1) AS RowIndex 
    FROM @t
)
SELECT MAX(CASE WHEN RowIndex=1 THEN c1 END) AS [Column1.1]
      ,MAX(CASE WHEN RowIndex=1 THEN c2 END) AS [Column2.1]
      ,MAX(CASE WHEN RowIndex=2 THEN c1 END) AS [Column1.2]
      ,MAX(CASE WHEN RowIndex=2 THEN c2 END) AS [Column2.2]
      ,MAX(CASE WHEN RowIndex=3 THEN c1 END) AS [Column1.3]
      ,MAX(CASE WHEN RowIndex=3 THEN c2 END) AS [Column2.3]
      ,MAX(CASE WHEN RowIndex=4 THEN c1 END) AS [Column1.4]
      ,MAX(CASE WHEN RowIndex=4 THEN c2 END) AS [Column2.4]
FROM Numbered
0 голосов
/ 21 мая 2018

Я бы попытался это сделать, НЕУДАВИВ данных и используя ROW_Number , чтобы получить целое число для ColumnName, например,

DECLARE @t TABLE ( Column1 CHAR(1), Column2 CHAR(3))
INSERT INTO @t
(Column1,Column2)
VALUES
('A', 'AAA') ,('B', 'BBB') ,('C', 'CCC') ,('D', 'DDD') 

SELECT 
     ColData = T.Column1
    ,ColName = 'Column1.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
FROM @t T
UNION
SELECT 
     ColData = T.Column2
    ,ColName = 'Column2.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
FROM @t T

, которое дает этот результат

ColData ColName
A       Column1.1
AAA     Column2.1
B       Column1.2
BBB     Column2.2
C       Column1.3
CCC     Column2.3
D       Column1.4
DDD     Column2.4

Итак, оберните это в запрос PIVOT, чтобы получить требуемый вывод

SELECT
    [Column1.1],[Column2.1],[Column1.2],[Column2.2],[Column1.3],[Column2.3],[Column1.4],[Column2.4]
FROM(
        SELECT 
             ColData = T.Column1
            ,ColName = 'Column1.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
        FROM @t T
        UNION
        SELECT 
             ColData = T.Column2
            ,ColName = 'Column2.' + CAST(ROW_NUMBER()OVER(ORDER BY (SELECT null)) AS NVARCHAR(5))
        FROM @t T
)AS Tab
PIVOT 
(  
    MAX(ColData)  
    FOR ColName IN ([Column1.1],[Column2.1],[Column1.2],[Column2.2],[Column1.3],[Column2.3],[Column1.4],[Column2.4])  
) AS PIV;

Вывод

Column1.1   Column2.1   Column1.2   Column2.2   Column1.3   Column2.3   Column1.4   Column2.4
A            AAA         B           BBB         C           CCC         D           DDD
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...