【发布时间】:2015-09-23 08:36:09
【问题描述】:
我的表格中有学生评估数据,看起来像
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 个连接才能获得 'Raw'、'Grade'、'Mpd' 和 'Rank 的 4 列'。有人可以帮助了解此类查询的语法和结构吗?
有没有比内部连接更好的方法?如果有更有效的方法来规范这个表,请告诉我?
【问题讨论】:
-
这是在 sqlserver 中吗?
-
自行加入!理想情况下,您应该从一开始就存储列 Raw、Grade、Mpd 和 Rank。
-
你能发表解释吗?我很好奇它是否在您执行的每一行上运行子选择。
-
@jarhl - 是的,我明白,但这张桌子不是我的。它由我们用来保存学生成绩以及所有其他学生详细信息的商业软件生成。
-
@Michael Dibbets - 抱歉,Michael 不确定你的意思是“你能发表解释吗”???
标签: sql sql-server pivot normalize