Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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:将表连接到自身以水平显示数据_Sql_Sql Server - Fatal编程技术网

SQL Server:将表连接到自身以水平显示数据

SQL Server:将表连接到自身以水平显示数据,sql,sql-server,Sql,Sql Server,我有一个包含学生分数(StudentsID、科目、年份、分数)的表 我想水平显示同一学生、科目但不同年份的分数 我的问题是,不是所有的科目都可以在所有的年份,我的意思是学生可以采取不同的科目,每年。我想在一张桌子上水平地展示它们 例如: 我试过这个问题 SELECT TOP (100) PERCENT dbo.New_Portal_OldMarks.StudentID, dbo.New_Portal_OldMarks.[Student Name], dbo.New_Port

我有一个包含学生分数(StudentsID、科目、年份、分数)的表

我想水平显示同一学生、科目但不同年份的分数

我的问题是,不是所有的科目都可以在所有的年份,我的意思是学生可以采取不同的科目,每年。我想在一张桌子上水平地展示它们

例如:

我试过这个问题

SELECT TOP (100) PERCENT 
    dbo.New_Portal_OldMarks.StudentID, dbo.New_Portal_OldMarks.[Student Name], 
    dbo.New_Portal_OldMarks.SubjectName, dbo.New_Portal_OldMarks.AcademicYear, 
    dbo.New_Portal_OldMarks.Class, dbo.New_Portal_OldMarks.Term1, dbo.New_Portal_OldMarks.Term2, 
    dbo.New_Portal_OldMarks.Term3, dbo.New_Portal_OldMarks.Final, 
    New_Portal_OldMarks_1.AcademicYear AS AcademicYear2, 
    New_Portal_OldMarks_1.Class AS Class2, 
    New_Portal_OldMarks_1.Term1 AS [Term1-2], 
    New_Portal_OldMarks_1.Term2 AS [Term2-2], 
    New_Portal_OldMarks_1.Term3 AS [Term3-2], 
    New_Portal_OldMarks_1.Final AS [Final-2]
FROM
    dbo.New_Portal_OldMarks 
FULL OUTER JOIN
    dbo.New_Portal_OldMarks AS New_Portal_OldMarks_1 ON dbo.New_Portal_OldMarks.StudentID = New_Portal_OldMarks_1.StudentID 
                                                     AND dbo.New_Portal_OldMarks.SubjectName = New_Portal_OldMarks_1.SubjectName
WHERE     
    (dbo.New_Portal_OldMarks.StudentID = 1004000)
ORDER BY 
    AcademicYear2

我尝试了所有的连接查询(ex-join、LEFT-join、RIGHT-join等),但都返回了错误的结果

您可以使用条件聚合:

SELECT om.ID, om.StudentID, om.[Student Name], om.SubjectName,
       MAX(CASE WHEN om.class = 11 THEN academicyear END) as academicyear,
       MAX(CASE WHEN om.class = 11 THEN class END) as class,
       MAX(CASE WHEN om.class = 11 THEN term1 END) as term1,
       MAX(CASE WHEN om.class = 11 THEN term2 END) as term2,
       MAX(CASE WHEN om.class = 11 THEN term3 END) as term3,
       MAX(CASE WHEN om.class = 11 THEN final END) as final,
       MAX(CASE WHEN om.class = 12 THEN academicyear END) as academicyear,
       MAX(CASE WHEN om.class = 12 THEN class END) as class,
       MAX(CASE WHEN om.class = 12 THEN term1 END) as term1,
       MAX(CASE WHEN om.class = 12 THEN term2 END) as term2,
       MAX(CASE WHEN om.class = 12 THEN term3 END) as term3,
       MAX(CASE WHEN om.class = 12 THEN final END) as final              
FROM dbo.New_Portal_OldMarks om
GROUP BY om.ID, om.StudentID, om.[Student Name], om.SubjectName

您使用的是什么sql?(mysql、mssql…)Microsoft SQL Server您必须创建一个包含动态列的临时表。使用每个years@RyanNghiem谢谢,我会试试的