Sql server 2008 动态轴心连接
我有一张代表员工及其各种细节的表格。我还有一张表,代表员工参加的培训课程。一些员工参加的课程比其他人多。我需要在返回的查询中将每个员工表示为一行,其中包含相关的详细信息以及他们参加过的每个课程的一列 员工表: +--------+---------+---------+----------+ | EmpNum | EmpName | EmpType | EmpPhone | +--------+---------+---------+----------+ | 1234 | Smith | FT | 09876543 | | 2345 | Jones | PT | 08765432 | | 3456 | Brown | FT | 07654321 | +--------+---------+---------+----------+ +--------+---------+---------+----------+ |EmpNum | EmpName | EmpType | emphone| +--------+---------+---------+----------+ |1234 |史密斯|英尺| 09876543| |2345 |琼斯| PT | 08765432| |3456 |布朗|英尺| 07654321| +--------+---------+---------+----------+ 技能表: +--------+------------+ | EmpNum | SkillName | +--------+------------+ | 1234 | First Aid | | 2345 | First Aid | | 3456 | First Aid | | 1234 | Safety | | 3456 | Safety | | 1234 | Leadership | | 2345 | Leadership | +--------+------------+ +--------+------------+ |EmpNum | SkillName| +--------+------------+ |1234 |急救| |2345 |急救| |3456 |急救| |1234 |安全| |3456 |安全| |1234 |领导力| |2345 |领导力| +--------+------------+ 加入这两个表后,我希望返回以下内容: +--------+---------+---------+----------+-----------+------------+------------+--------+ | 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 | | | +--------+---------+---------+----------+-----------+------------+------------+--------+ +--------+---------+---------+----------+-----------+------------+------------+--------+ |EmpNum | EmpName | emphone | Skill1 | Skill2 | Skill3 | Skill4| +--------+---------+---------+----------+-----------+------------+------------+--------+ |1234 |史密斯|英尺| 09876543 |急救|安全|领导|| |2345 |琼斯| PT | 08765432 |急救|领导力|| |3456 |布朗|英尺| 07654321 |急救|安全|| +--------+---------+---------+----------+-----------+------------+------------+--------+Sql server 2008 动态轴心连接,sql-server-2008,Sql Server 2008,我有一张代表员工及其各种细节的表格。我还有一张表,代表员工参加的培训课程。一些员工参加的课程比其他人多。我需要在返回的查询中将每个员工表示为一行,其中包含相关的详细信息以及他们参加过的每个课程的一列 员工表: +--------+---------+---------+----------+ | EmpNum | EmpName | EmpType | EmpPhone | +--------+---------+---------+----------+ | 1234 | Smith
你要找的是一个动态交叉表。更多信息,请阅读Jeff Moden的文章
你要找的是一个动态交叉表。更多信息,请阅读Jeff Moden的文章
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)