我将学生评估数据放在一个类似于
的表格中Year Semester Studentid AssessmentCode Hdg1 Hdg2 Result
2015 2 122 10ENG Ass1 Raw 80
2015 2 122 10ENG Ass1 Grade B
2015 2 122 10ENG Ass1 Mpd 85
2015 2 122 10ENG Ass1 Rank 25
2015 2 122 10ENG Ass2 Raw 78
2015 2 122 10ENG Ass2 Grade B
2015 2 122 10ENG Ass2 Mpd 83
2015 2 122 10ENG Ass2 Rank 28
2015 2 287 10ENG Ass1 Raw 70
2015 2 287 10ENG Ass1 Grade C
2015 2 287 10ENG Ass1 Mpd 78
2015 2 287 10ENG Ass1 Rank 43
2015 2 287 10ENG Ass2 Raw 82
2015 2 287 10ENG Ass2 Grade B
2015 2 287 10ENG Ass2 Mpd 88
2015 2 287 10ENG Ass2 Rank 10
依旧......
使用分析软件来寻找趋势,性能变化等非常困难。我真的需要将数据规范化,看起来像
Year Semester Studentid AssessmentCode Hdg1 Raw Grade Mpd Rank
2015 2 122 10ENG Ass1 80 B 85 25
2015 2 122 10ENG Ass2 78 B 83 28
2015 2 287 10ENG Ass1 70 C 78 43
2015 2 287 10ENG Ass2 82 B 88 10
我使用了一个类似于此的数据透视表达式创建了一个查询...
SELECT Year,
Semester,
StudentID,
AssessmentCode,
Hdg1,
[Raw],
[Grade],
[Mpd],
[Rank]
FROM (Select vStudentReportsSemesterResults.Year,
vStudentReportsSemesterResults.Semester,
vStudentReportsSemesterResults.studentID,
vStudentReportsSemesterResults.AssessmentCode,
vStudentReportsSemesterResults.Hdg1,
vStudentReportsSemesterResults.Hdg2,
vStudentReportsSemesterResults.Result
from vStudentReportsSemesterResults ) sq
PIVOT (Max (sq.Result) FOR sq.Hdg2 IN ([Raw], [Grade], [Mpd], [Rank])) AS pt
where AssessAreaHdgAbbrev1 like 'Ass%'
order by AssessmentCode, Hdg1, studentid
现在这样可行,但返回结果需要相当长的时间(300,000行约1分钟)当我尝试有时运行时,我会遇到问题。
有没有更好的方法来设置它,哪个更高效,更快速运行?我在思考内部连接,但我不确定所需的语法以及如何设置它,因为我认为你需要4个连接来获得4个'Raw','Grade','Mpd'和'Rank ”。有人可以帮助解决这种查询的语法和结构。
有比内连接更好的方法吗?如果有一种更有效的规范化方法,请告诉我吗?
答案 0 :(得分:0)
我认为索引可以帮助这个查询。尝试在vStudentReportsSemesterResults(AssessAreaHdgAbbrev1, year, semester, studentId, AssessmentCode, Hdg1)
上创建索引。
如果" v"在表名的开头真的意味着"查看",那么您的性能问题可能与视图有关,而不是与数据透视。在这种情况下,将视图转储到临时表中并在该表上运行数据透视表。或者,索引/物化视图可能会有所帮助。