我可能遗漏了一些非常明显的东西,但我无法让我的RIGHT JOIN在我的SQL语句中正常工作。
我有一个包含以下列的表:
id,test_id,score,class_id,rec_date
我希望得到每个测试的每个班级的平均分数,由test_id确定。我有以下SQL语句:
SELECT c.class_id,
ROUND(AVG(CASE WHEN s.test_id=1 THEN s.score END),1) AS test1,
ROUND(AVG(CASE WHEN s.test_id=2 THEN s.score END),1) AS test2,
ROUND(AVG(CASE WHEN s.test_id=3 THEN s.score END),1) AS test3
FROM scores s
RIGHT JOIN classes c ON s.class_id=c.class_id
GROUP BY c.class_id
我希望生成空值,即使没有类的分数,但是当一个或多个测试存在分数时,此语句仅生成类的数据。我相信我的问题可能与我使用CASE运算符计算AVG的方式有关。
答案 0 :(得分:0)
您正在聚合不同的行集,因此您必须在SELECT
部分中使用子查询。像这样:
SELECT c.class_id,
ROUND(AVG(SELECT s.score
FROM scores s
WHERE s.test_id = 1
AND s.class_id = c.class_id)) AS test1,
ROUND(AVG(SELECT s.score
FROM scores s
WHERE s.test_id = 2
AND s.class_id = c.class_id)) AS test2,
ROUND(AVG(SELECT s.score
FROM scores s
WHERE s.test_id = 3
AND s.class_id = c.class_id)) AS test3
FROM classes c