SQL транспонировать строки в столбцы - PullRequest
0 голосов
/ 13 марта 2019

Я пытаюсь переместить строки в столбцы, но не нашел хороших ответов.

Вот пример того, что я хочу:

Входные таблицы:


TABLE A    
ID | NAME     
1   | BOB    
2   | JIM    
3   | ROB

TABLE B

ID  | CLUB
1   | 2    
1   | 3    
1   | 4    
2   | 2    
2   | 1    
3   | 5

ВЫХОД будет:

ID  | CLUB1 | CLUB2 | CLUB3    
1   | 2     | 3     | 4    
2   | 2     | 1     |    
3   | 5     |       |

Ответы [ 4 ]

0 голосов
/ 13 марта 2019

Пример данных

IF OBJECT_ID('tempdb..#TempTab')IS NOT NULL
DROP TABLE #TempTab
;WITH CTE (ID,CLUB)
AS
(
SELECT 1   , 2 UNION ALL   
SELECT 1   , 3 UNION ALL   
SELECT 1   , 4 UNION ALL   
SELECT 2   , 2 UNION ALL   
SELECT 2   , 1 UNION ALL    
SELECT 3   , 5
)

SELECT  ID,
        CLUB,
        'CLUB'+CAST(ROW_NUMBER()OVER(PARTITION BY ID ORDER BY ID) AS VARCHAR) AS CLUBData
INTO #TempTab
FROM CTE

Динамический sql

DECLARE @Column nvarchar(1000),@Column2 nvarchar(max),
        @Sql nvarchar(max)

SELECT @Column =STUFF((SELECT DISTINCT  ', '+QUOTENAME(CLUBData)
            FROM #TempTab FOR XML PATH ('')),1,1,'')

SET @Sql = 'SELECT Id,'+@Column +' 
            FROM 
               (
                SELECT * FROM #TempTab 
               ) AS SRc
             PIVOT
               (
                MAX(CLUB) FOR CLUBData IN ('+@Column+')
               ) AS pvt
               '
PRINT @Sql
EXEC (@Sql)

1007 * Результат *

Id  CLUB1   CLUB2   CLUB3
-------------------------
1    3        4       2
2    1        2      NULL
3    5        NULL   NULL
0 голосов
/ 13 марта 2019

использовать условное агрегирование

select id, 
       max(case when id=1 then club end) club1,
       max(case when id=2 then club end) club2,
       max(case when id=3 then club end) club3
from tablename
group by id
0 голосов
/ 13 марта 2019

вариант использования, когда

    select a.id,max(case when name='BOB' then CLUB end) ,
    max(case when name='JIM' then CLUB end),
    max(case when name='ROB' then CLUB end)
    tablea a join tableb b on a.id=b.id group by a.id
0 голосов
/ 13 марта 2019

Вам нужно перечислить значения для их поворота:

select id,
       max(case when seqnum = 1 then club end) as club_1,
       max(case when seqnum = 2 then club end) as club_2,
       max(case when seqnum = 3 then club end) as club_3
from (select b.*,
             row_number() over (partition by id order by club) as seqnum
      from b
     ) b
group by id;
...