【问题标题】:SQL Join another lookup table in a pivot tableSQL 在数据透视表中加入另一个查找表
【发布时间】:2015-02-26 21:28:52
【问题描述】:

我的数据库中有一个名为 Grades 的表,用于将学生的成绩记录为他们参加的每一年和学期的分数。使用查找表将这些点转换为 GCSE 结果。虽然我可以使用数据透视表返回分数,但我不知道如何返回用分数代替 GCSE 成绩的表格。

我的成绩表如下所示:

PupilID, GradeSubject, YearAndTerm, Grade
10001, English, Y7T1, 81
10001, English, Y7T2, 85
10001, English, Y7T3, 92

我的 GradesToPoints 查找表如下所示:

PointGrade, GCSEGrade
80, E-
81, E
82, E+
83, D-
84, D

我有以下 SQL 语句,它返回一个包含我需要的列但带有分数的表,我希望每列(Y7T1、Y7T2 等)通过使用查找表 GradesToPoints 返回该点的 GCSE 成绩。

SELECT *
FROM (
    SELECT PupilID, GradeSubject, YearAndTerm, Grade  
    FROM Grades  
    ) AS DT
PIVOT(SUM(Grade) FOR YearAndTerm IN ([KeyStage2],[Y7T1],[Y7T2],[Y7T3], 
    [Y8T1],[Y8T2],[Y8T3],[Y9T1],[Y9T2],[Y9T3],[Y10T1],[Y10T2],[Y10T3],
    [Y11T1],[Y11T2],[Y11T3],[Y12T1],[Y12T2],[Y12T3],[Y13T1],[Y13T2],
    [Y13T3],[Y14T1],[Y14T2],[Y14T3])) AS PVT

提前感谢您为此提供的任何帮助

【问题讨论】:

    标签: sql sql-server database join pivot


    【解决方案1】:

    看来您的SUM 聚合只是一个假人。我不得不将其更改为MIN,以便它可以与 char 列一起使用。关键在于需要在枢轴之前完成的内部连接。

    SELECT *
    FROM (
        SELECT g.PupilID, g.GradeSubject, g.YearAndTerm, g2p.GCSEGrade
        FROM Grades as g INNER JOIN GradesToPoints as g2p on g2p.PointGrade = g.Grade
        ) AS DT
    PIVOT(MIN(GCSEGrade) FOR YearAndTerm IN ([KeyStage2],[Y7T1],[Y7T2],[Y7T3], 
        [Y8T1],[Y8T2],[Y8T3],[Y9T1],[Y9T2],[Y9T3],[Y10T1],[Y10T2],[Y10T3],
        [Y11T1],[Y11T2],[Y11T3],[Y12T1],[Y12T2],[Y12T3],[Y13T1],[Y13T2],
        [Y13T3],[Y14T1],[Y14T2],[Y14T3])) AS PVT
    

    【讨论】:

    • 不是我想要的。这将创建一个名为 GCSEGrade 的新列,其中包含 GCSE 成绩。我不希望这样,我希望 GCSE 成绩位于 Y7T1、Y7T2、Y7T3 等列下,而不是当前出现在它们下方的点
    • 尝试只列出您需要的列,而不是*。我对查询进行了一些编辑,以防您运行旧版本。 (我不小心留在了枢轴运算符内的旧成绩列中。)
    • 这很好用,完全符合我的需要。为什么你建议使用列名而不是 * ?
    • 我在想额外的列会改变枢轴。但我想这无论如何都不是问题。
    • 即使 Grade 的值为 NULL,有没有办法列出所有行?
    猜你喜欢
    • 2020-10-10
    • 2021-02-06
    • 1970-01-01
    • 1970-01-01
    • 2021-03-06
    • 2021-12-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多