【问题标题】:SQL RIGHT JOIN not workingSQL RIGHT JOIN 不起作用
【发布时间】:2013-10-01 09:10:33
【问题描述】:

我可能遗漏了一些非常明显的东西,但我无法让我的 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 的方式。

【问题讨论】:

  • 你试过逆向吗(LEFT OUTER JOIN)?
  • 您是否尝试过颠倒表格的顺序并使用 LEFT JOIN?
  • 您的查询绝对没有问题。它有效,我测试了它。看看你的数据怎么样?
  • @t-clausen.dk 你是对的,类表中的数据有问题。谢谢你的帖子。

标签: mysql sql case average right-join


【解决方案1】:

您正在聚合不同的行集,因此您必须在 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

【讨论】:

    猜你喜欢
    • 2011-02-21
    • 2018-11-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多