Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.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_Tsql - Fatal编程技术网

组合多个表和数据透视的SQL

组合多个表和数据透视的SQL,sql,sql-server,tsql,Sql,Sql Server,Tsql,我有这些桌子 Student - studentID, batchID, courseID, FirstName, Last Name ... Subject - subjectID, courseID, subjectName ... Mark - markID, studentID, subjectID, Marks Course - courseID, courseName ... 我尝试了这么长时间,最后终于得到了这个 SELECT S.studentID AS 'ID', S.Fir

我有这些桌子

Student - studentID, batchID, courseID, FirstName, Last Name ...
Subject - subjectID, courseID, subjectName ...
Mark - markID, studentID, subjectID, Marks
Course - courseID, courseName ...
我尝试了这么长时间,最后终于得到了这个

SELECT S.studentID AS 'ID', S.FirstName + ' ' + S.LastName AS 'Full Name', M.Marks AS 'Subject'
FROM Student AS S
LEFT JOIN Mark AS M ON S.studentID = M.studentID AND M.subjectID = 'S1001'
WHERE S.batchID = 1
这一个只显示一个主题的数据,主题名称是由C#(Winforms)使用subjectID生成的

Student ID | Full Name    | Elementary Programming in C
-------------------------------------------------------
    1      | student name |        50
    2      | abc          |        80
但我希望它显示该课程中的所有主题以及该列中的相应标记,如下图所示(如果给定了subjectID,则不介意我是否必须使用Winforms生成列标题)

我尝试过使用pivot,但不是很成功。。。 希望有人能给我一个或两个想法,如果你需要更多信息,请询问…

试试这个, 声明@cols为NVARCHAR(最大值), @查询为NVARCHAR(最大值)


你知道课程的数量吗?还是每个学生都是动态的?@sgedes该学生只能参加一门课程,因此只能参加一门课程。我的意思是你是否有预定义的预期列数,或者每个结果都是动态的。如果您知道advanced中的列(即初等编程、html、c#、sql等),那么您可以非常轻松地构造
pivot
表,或者使用
max
case
。如果您有一组动态列,则必须创建一个
动态sql
语句。@sgedes:每门课程的科目数量不同,例如,如果课程是软件工程文凭,它有HTML和C#等科目,而多媒体课程有CorelDraw等其他科目,看看这是否有用:
Student ID | Full Name    | Elementary Programming in C | HTML | ...
-----------------------------------------------------------------
    1      | student name |        50                   |  70  | ...
    2      | abc          |        80                   |  60  | ...
select @cols = stuff((select distinct ',' + quotename(subjectName) 
                from Subject WHERE courseID = 'C1001'
        FOR XML PATH(''), TYPE
        ).value('.', 'NVARCHAR(MAX)') 
    ,1,1,'')

set @query = 'select studentID,' + @cols + '
         from 
         (
            select S.studentID, ss.subjectID, M.Marks
            from Student S
              join Subject ss on S.courseID = ss.courseID 
              join Mark M on M.subjectID = ss.SubjectID AND M.studentID = S.StudentID
            where S.batchID = 1
        ) x
        pivot 
        (
            max(Marks)
            for subjectName in (' + @cols + ')
        ) p '

execute(@query)