我在下面有一个数据库示例:
会话表:
SessionId (PK auto) SessionName
1 SODJW
问题表:
QuestionId (PK auto) QuestionContent SessionId (FK) refer to Session
1 Blah 1
2 Blah Blah 1
3 Blah Blah Blah 1
Penalty_Marks表:
PenaltyAnswerId PenaltyMarks QuestionId (FK) refer to Question
1 1 1
2 0 1
3 1 2
4 2 3
5 2 3
现在我想执行一个SQL,它会计算会话的PenaltyMarks
。为此,我们需要知道哪个QuestionId
属于SessionId
,然后计算标记。
我的问题是如何编写SQL以便能够在QuestionId
内找到SessionId
,以便我们可以计算罚分数?原因我问这是因为它给了我不正确的计数值。
我的尝试:
SELECT COUNT(PenaltyMarks)
FROM Session s
INNER JOIN Question q ON s.SessionId = q.SessionId
INNER JOIN Penalty_Marks pm ON q.QuestionId = pm.QuestionId
WHERE s.SessionId = 1;
答案 0 :(得分:3)
您的查询返回行数,而不是惩罚总计数。另外你说你需要用总惩罚标记查看每个会话的问题,所以你必须按会话ID和问题ID进行分组。
SELECT s.SessionId,q.QuestionId,SUM(pm.PenaltyMarks)
FROM Session s
INNER JOIN Question q ON s.SessionId = q.SessionId
INNER JOIN Penalty_Marks pm ON q.QuestionId = pm.QuestionId
GROUP BY s.SessionId,q.QuestionId
答案 1 :(得分:1)
我认为您需要SUM(PenaltyMarks)
而不是COUNT(PentaltyMarks)
您可能还需要GROUP BY QuestionId
我现在无法测试它。
答案 2 :(得分:1)
Count返回行数;您想使用sum(),它会为您添加行中的值。