规范化SQL表中的数据

时间:2015-07-06 09:06:37

标签: sql sql-server pivot normalize

我将学生评估数据放在一个类似于

的表格中
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 ”。有人可以帮助解决这种查询的语法和结构。

有比内连接更好的方法吗?如果有一种更有效的规范化方法,请告诉我吗?

1 个答案:

答案 0 :(得分:0)

我认为索引可以帮助这个查询。尝试在vStudentReportsSemesterResults(AssessAreaHdgAbbrev1, year, semester, studentId, AssessmentCode, Hdg1)上创建索引。

如果" v"在表名的开头真的意味着"查看",那么您的性能问题可能与视图有关,而不是与数据透视。在这种情况下,将视图转储到临时表中并在该表上运行数据透视表。或者,索引/物化视图可能会有所帮助。