Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.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 返回带有矩阵的表的存储过程_Sql_Sql Server_Stored Procedures - Fatal编程技术网

Sql 返回带有矩阵的表的存储过程

Sql 返回带有矩阵的表的存储过程,sql,sql-server,stored-procedures,Sql,Sql Server,Stored Procedures,我有以下三张桌子 员工: Name, LastName, SSN Course, Year, Period Course, SSN, Year, Period, Hours 课程实例: Name, LastName, SSN Course, Year, Period Course, SSN, Year, Period, Hours 出席者: Name, LastName, SSN Course, Year, Period Course, SSN, Year, Period, Ho

我有以下三张桌子

员工:

Name, LastName, SSN
Course, Year, Period
Course, SSN, Year, Period, Hours
课程实例:

Name, LastName, SSN
Course, Year, Period
Course, SSN, Year, Period, Hours
出席者:

Name, LastName, SSN
Course, Year, Period
Course, SSN, Year, Period, Hours
我试图创建一个存储过程,它返回一个表,其中包含给定年份中前4个课程实例的矩阵(作为过程的参数)

返回的矩阵需要如下所示:

Name | LastName | Course | Course | Course | Course
四门不同的
课程
是给定年份的前四门课程,因此我现在得到的是查找这些课程的代码:

DECLARE myCursor CURSOR FOR
   SELECT top 4 Course 
   FROM Course Instance 
   WHERE Year = @year 
   ORDER by Period
矩阵的其余部分应该只从上表中获取值,基本上,参加过任何课程的所有工作人员都应该在矩阵中包含正确的信息。在每一个
课程
栏下,我想知道参加培训的员工的小时数

样本表

工作人员:

Name | LastName | SSN 
Steve  Lastname   234 
Pete   Steven     132
课程实例:

Course | Year | Period 
DVA123   2013   1 
DVA222   2014   2
出席者:

Course | SSN | Year | Period | Hours 
DVA123   234   2013   1        200 
DVA222   132   2014   2        50
该项目的预期产出:

Name | LastName | DVA123 | DVA222 | nothing | nothing
Pete   Steven     200
Steve  Lastname            50

我不确定CourseInstance如何链接到出席者,但您可以通过使用和:

它使用了
MAX(Course)
,但这实际上并不相关,因为
CourseNum
对于每个
SSN
都是唯一的,您只能选择一行的最大值。您可以同样轻松地使用
MIN


我一点也不提倡这种方法,但是,如果您选择动态SQL方法而不是在表示层中这样做,它将帮助您开始:

DECLARE @Courses NVARCHAR(MAX) = STUFF((SELECT  TOP 4 ',' + QUOTENAME(course)
                                        FROM    (   SELECT  course, Period, SortOrder = 0
                                                    FROM    CourseInstance
                                                    WHERE   Year = @Year
                                                    UNION ALL

                                                    -- THIS IS REQUIRED TO FILL GAPS WHERE THERE AREN'T ENOUGH COURSES
                                                    SELECT  TOP 4 
                                                            'Nothing' + CAST(ROW_NUMBER() OVER(ORDER BY object_id) AS CHAR(1)),
                                                            0,
                                                            1
                                                    FROM    sys.all_objects
                                                ) t
                                        ORDER BY SortOrder, Period, course
                                        FOR XML PATH(''), TYPE
                                        ).value('.', 'NVARCHAR(MAX)'), 1, 1, '');


DECLARE @SQL NVARCHAR(MAX) = 
    '   SELECT  Name, LastName, ' + @Courses + '
        FROM    (   SELECT  s.Name, s.LastName, s.SSN, ci.Course, a.Hours
                    FROM    AttendedBy a
                            INNER JOIN Staff s
                                ON s.SSN = a.SSN
                            INNER JOIN CourseInstance ci
                                ON a.Course = ci.Course
                                AND a.Year = ci.Year
                                AND a.Period = ci.Period
                ) d
                PIVOT
                (   SUM(Hours)
                    FOR Course IN (' + @Courses + ')
                ) pvt;';

EXECUTE SP_EXECUTESQL @SQL;

使用self left join.else共享示例数据几乎就是我要找的,我如何修改它而不是键入“Course1,Course2”等键入课程的实际名称,并在列下从出席人员表中获取小时数我不确定您的确切意思,请你用一些示例数据和预期输出更新你的问题好吗?在具有预期输出的表中添加了一些示例数据,希望它能更清楚地说明我想要实现的目标。(没有什么只是意味着它应该被保留在blanc中)如果不使用动态SQL,您就无法做到这一点,因此我不建议您这样做。将数据作为列标题似乎是一个奇怪的要求。你不能在你的应用层处理这个问题吗?也许,我想我必须研究一下动态SQL,看看是否能找到解决方案,谢谢!