【问题标题】:Select items by column value按列值选择项目
【发布时间】:2015-01-12 21:02:15
【问题描述】:

我在 SQL 中有一个表,用于存储这样的结果

Result
---------------
ID | DateCreated
1  | 2014-10-10

上面结果下的Items

ResultItems
---------------
ResultID | StudentID | SubjID    | Test1 | Test2 | Exam
1        | 1         | 1         | 7     | 7     | 30
1        | 2         | 1         | 8     | 8     | 35
1        | 1         | 2         | 5     | 5     | 45
1        | 2         | 2         | 6     | 6     | 40

我需要从这些表中进行选择,以便每个科目都在自己的列中,每个科目的分数在它下面相加

结果项

Result Output
---------------
StudentID| SubjID-1  | SubjID-2
1        | 44        | 55      
2        | 51        | 52      

我确实尝试过安静一些查询,例如下面的这个,它没有给出我需要的结果

SELECT r.*,
       ri.StudentID,
       ri.Test1,
       ri.Test2,
       ri.Exam,
       ( ri.Test1+ ri.Test2 + ri.Exam )  Total
  FROM Result r
       LEFT JOIN ResultItems ri
              ON ri.ResultID = r.id
 WHERE ri.Test1 <> '-' 
       AND
       ri.Test2 <> '-' 
       AND
       ri.exam <> '-';

如何修改此查询?

编辑

我阅读了 Pivot 并看到了这个问题 SQL - columns for different categories,在这种情况下,必须事先知道主题的名称/ID,这不适用于我的情况

【问题讨论】:

    标签: sql sqlite select


    【解决方案1】:

    SQL Server 解决方案

    您只需拨打Pivot

    CREATE TABLE #ResultItems
    (
        ResultID INT,
        StudentID INT,
        SubjID INT,
        Test1 INT,
        Test2 INT,
        Exam INT
    )
    
    
    INSERT INTO #ResultItems (ResultID, StudentID, SubjID, Test1, Test2, Exam)
    VALUES(1, 1 , 1 , 7, 7, 30),
    (1, 2 , 1 , 8, 8, 35),
    (1, 1 , 2 , 5, 5, 45),
    (1, 2 , 2 , 6, 6, 40)
    
    SELECT StudentId, [1], [2]
    FROM (
        SELECT StudentId, SubjID, Test1 + Test2 + Exam AS TmpSum
        FROM #ResultItems
    ) AS DT
    PIVOT(SUM(TmpSum) FOR SubjID IN ([1], [2])) AS PT
    
    DROP TABLE #ResultItems 
    

    SQLite 解决方案

    用例

    SELECT StudentId, SUM(Subj1) AS Subj1, SUM(Subj2) As Subj2
    FROM (
    SELECT t1.StudentId, CASE WHEN SubjID = 1 THEN Test1 + Test2 + Exam ELSE 0 END AS Subj1,
            CASE WHEN SubjID = 2 THEN Test1 + Test2 + Exam ELSE 0 END  AS Subj2
        FROM #ResultItems AS t1
    ) AS T
    GROUP BY T.StudentID 
    

    或子查询:

    SELECT t1.StudentId, (SELECT Test1 + Test2 + Exam FROM #ResultItems WHERE StudentID = t1.StudentID AND SubjID = 1) AS Subj1,
            (SELECT Test1 + Test2 + Exam FROM #ResultItems WHERE StudentID = t1.StudentID AND SubjID = 2) AS Subj2
        FROM #ResultItems AS t1
    GROUP BY t1.StudentID 
    

    【讨论】:

    • 我只看到了 SQL 标签,我错过了 sqllite ;)。我会改进我的答案。请稍等。
    • 再次感谢您的帮助,这需要我事先知道主题 ID,这是行不通的,因为可以删除一个主题并添加另一个主题
    • 那么...您需要更通用的解决方案吗?
    • 据我所知,使用清晰的 SQL 是不可能实现的。我建议使用任何编程语言 + Linq。
    猜你喜欢
    • 1970-01-01
    • 2011-01-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-27
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多