Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 2008 动态轴心连接_Sql Server 2008 - Fatal编程技术网

Sql server 2008 动态轴心连接

Sql server 2008 动态轴心连接,sql-server-2008,Sql Server 2008,我有一张代表员工及其各种细节的表格。我还有一张表,代表员工参加的培训课程。一些员工参加的课程比其他人多。我需要在返回的查询中将每个员工表示为一行,其中包含相关的详细信息以及他们参加过的每个课程的一列 员工表: +--------+---------+---------+----------+ | EmpNum | EmpName | EmpType | EmpPhone | +--------+---------+---------+----------+ | 1234 | Smith

我有一张代表员工及其各种细节的表格。我还有一张表,代表员工参加的培训课程。一些员工参加的课程比其他人多。我需要在返回的查询中将每个员工表示为一行,其中包含相关的详细信息以及他们参加过的每个课程的一列

员工表:

+--------+---------+---------+----------+ | 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 |急救|安全|| +--------+---------+---------+----------+-----------+------------+------------+--------+
你要找的是一个动态交叉表。更多信息,请阅读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)