Select 项(按列值)

Select items by column value

我在 SQL 中有一个 table 用于像这样存储结果

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

以上结果下的项目

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

我需要 select 从这个 table 开始,这样每个科目都在自己的栏中,每个科目的分数都在它下面求和

结果项

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,在这种情况下,主题的 names/id 必须事先知道,这对我的情况不起作用

SQL 服务器的解决方案

你所需要的只是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 

SQL站点解决方案

用例

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