2015-08-25 9 views
1

У меня есть таблица, представляющая сотрудников и их различные детали. У меня есть еще один стол, представляющий учебные курсы, в которых приняли участие сотрудники. Некоторые сотрудники посещали больше курсов, чем другие. Мне нужно представить каждого сотрудника как одну строку в возвращаемом запросе со связанными данными и столбцом для каждого курса, в котором они были.Dynamic Pivot and Join

Сотрудник Таблица:

 
+--------+---------+---------+----------+ 
| EmpNum | EmpName | EmpType | EmpPhone | 
+--------+---------+---------+----------+ 
| 1234 | Smith | FT  | 09876543 | 
| 2345 | Jones | PT  | 08765432 | 
| 3456 | Brown | FT  | 07654321 | 
+--------+---------+---------+----------+ 

Умение Таблица:

 
+--------+------------+ 
| EmpNum | SkillName | 
+--------+------------+ 
| 1234 | First Aid | 
| 2345 | First Aid | 
| 3456 | First Aid | 
| 1234 | Safety  | 
| 3456 | Safety  | 
| 1234 | Leadership | 
| 2345 | Leadership | 
+--------+------------+ 

После присоединения этих 2 таблицы, я ищу, чтобы иметь следующие вернулись:

 
+--------+---------+---------+----------+-----------+------------+------------+--------+ 
| EmpNum | EmpName | EmpType | EmpPhone | Skill1 | Skill2 | Skill3 | Skill4 | 
+--------+---------+---------+----------+-----------+------------+------------+--------+ 
| 1234 | Smith | FT  | 09876543 | First Aid | Safety  | Leadership |  | 
| 2345 | Jones | PT  | 08765432 | First Aid | Leadership |   |  | 
| 3456 | Brown | FT  | 07654321 | First Aid | Safety  |   |  | 
+--------+---------+---------+----------+-----------+------------+------------+--------+ 

ответ

0

Что вы» re look for - динамическая кросс-таблица. Прочтите это article от Jeff Moden за дополнительной информацией.

SQL Fiddle

DECLARE @sql1 NVARCHAR(2000) = '', 
     @sql2 NVARCHAR(2000) = '', 
     @sql3 NVARCHAR(2000) = '' 

DECLARE @range INT 

--Added +1 here since you have extra Skill4 on your expected result 
SELECT TOP 1 @range = COUNT(*) + 1 
FROM Skill GROUP BY EmpNum ORDER BY COUNT(*) DESC 

SELECT @sql1 = 
'SELECT 
    e.EmpNum 
    , e.EmpName 
    , e.EmpType 
    , e.EmpPhone' + CHAR(10) 

SELECT @sql2 = @sql2 + 
' , MAX(CASE WHEN rn = ' + CONVERT(VARCHAR(3), rn) + ' THEN s.SkillName ELSE '''' END) AS ' 
    + QUOTENAME('Skill' + CONVERT(VARCHAR(3), rn))+ CHAR(10) 
FROM(
    SELECT TOP (@range) 
     ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) AS rn 
    FROM master..spt_values a 
)t 

SELECT @sql3 = 
'FROM(
    SELECT *, rn = ROW_NUMBER() OVER(PARTITION BY EmpNum ORDER BY (SELECT NULL)) 
    FROM Skill 
)s 
INNER JOIN Employee e 
    ON e.EmpNum = s.EmpNum 
GROUP BY 
    e.EmpNum, e.EmpName, e.EmpType, e.EmpPhone' 

PRINT(@sql1 + @sql2 + @sql3) 
EXEC (@sql1 + @sql2 + @sql3) 
+0

Высокий. Спасибо. – Goolsy