У меня есть таблица с результатами, как это:Динамическая шарнирные несколько столбцов
EMP_ID | Boss_ID | Boss_Name | Specialty
1001 001 John sql
1001 001 John c#
1002 002 James c++
1002 003 Sarah sql
1002 003 Sarah python
1003 004 Jesse networking
Сотрудники могут иметь несколько боссов, которые могут иметь несколько специальностей.
Мне нужно динамически поворачивать данные, чтобы у меня была одна строка на одного сотрудника. Мне нужно отобразить сотрудника, всех боссов, которые у них есть, и только их специализацию по линии 1.
Я могу использовать динамический поворот и отображать часть нескольких боссов, но я не уверен, как отображать их специальность рядом с их именем.
Вот что у меня есть:
DECLARE @cols AS NVARCHAR(max)
,@query AS NVARCHAR(max)
select t.EMP_ID
,t.Boss_Name
,t.Boss_ID
,t.Specialty
,'BOSS' + '_' + cast(ROW_NUMBER() OVER (PARTITION BY t.EMP_ID ORDER BY t.BOSS_ID asc) AS VARCHAR) AS b_rn
,'SPEC' + '_' + cast(ROW_NUMBER() OVER (PARTITION BY t.Specialty ORDER BY t.BOSS_ID asc) AS VARCHAR) AS spec_rn
INTO #work
from #testing t
SELECT @cols = STUFF(
(SELECT DISTINCT TOP 100 PERCENT '],[' + w.b_rn
FROM #work w
ORDER BY '],[' + w.b_rn
FOR XML PATH('')
), 1, 2, ''
) + ']'
PRINT @cols
SET @query = N' SELECT EMP_ID,' + @cols + N'
INTO ##work_results FROM
(
SELECT EMP_ID
,Boss_Name
,b_rn
FROM #work
) AS sourcetable
PIVOT
(
max(Boss_Name) for b_rn IN ('+ @cols + N')
) AS pivot_table'
execute(@query)
select * from ##work_results
Это дает мне:
EMP_ID | BOSS_1 | BOSS_2 | BOSS_3
1001 John John NULL
1002 James Sarah Sarah
1003 Jesse NULL NULL
То, что я действительно ищет это результаты, как это:
EMP_ID | Boss_1 | Specialty_1 | Boss_2 | Specialty_1
1001 John sql
1002 James c++ Sarah sql
1003 Jesse networking
Я смотрел другие сообщения, но они не совсем то, что я ищу.
Любая помощь будет замечательной.
Спасибо!
Это одно из ограничений PIVOT. Он не может поворачивать несколько столбцов. Я предпочитаю использовать динамическую перекрестную вкладку даже с одним столбцом. Для меня синтаксис менее тупой, и он даже имеет небольшое преимущество в производительности. Вот замечательная статья, объясняющая, как это работает. http://www.sqlservercentral.com/articles/Crosstab/65048/ –
Я прочитаю эту статью. Спасибо за ответ! – jw133
Возможно, вы можете присоединиться к 'pivot_table' обратно к' # testing', чтобы получить специальность для каждого босса. Вы должны были бы присоединиться один раз для каждой колонки босса. –