【问题标题】:Normalize data from an SQL Table规范化 SQL 表中的数据
【发布时间】: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


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 2012-11-18
    • 2011-11-17
    • 1970-01-01
    • 2011-03-31
    • 2017-07-31
    • 2014-10-21
    • 1970-01-01
    • 2012-12-31
    • 2015-02-15
    相关资源
    最近更新 更多