【问题标题】:Where and group conflict?哪里和群冲突?
【发布时间】:2017-04-11 06:41:01
【问题描述】:

我有一张这样的桌子:

mysql> select * from studentscore;
+------------+-----------+-------+
| student_id | cource_id | score |
+------------+-----------+-------+
|          1 |         1 |    80 |
|          1 |         2 |    90 |
|          1 |         3 |    85 |
|          1 |         4 |    78 |
|          2 |         2 |    53 |
|          2 |         3 |    77 |
|          2 |         5 |    80 |
|          3 |         1 |    71 |
|          3 |         2 |    70 |
|          3 |         4 |    80 |
|          3 |         5 |    65 |
|          3 |         6 |    75 |
|          4 |         2 |    90 |
|          4 |         3 |    80 |
|          4 |         4 |    70 |
|          4 |         6 |    95 |
|          5 |         1 |    60 |
|          5 |         2 |    70 |
|          5 |         5 |    80 |
|          5 |         6 |    69 |
|          6 |         1 |    76 |
|          6 |         2 |    88 |
|          6 |         3 |    87 |
|          7 |         4 |    80 |
|          8 |         2 |    71 |
|          8 |         3 |    58 |
|          8 |         5 |    68 |
|          9 |         2 |    88 |
|         10 |         1 |    77 |
|         10 |         2 |    76 |
|         10 |         3 |    80 |
|         10 |         4 |    85 |
|         10 |         5 |    83 |
|         11 |         3 |    80 |
|         12 |         4 |    99 |
|         13 |         5 |    74 |
+------------+-----------+-------+

我想显示 student_id 和学生的平均分高于 80。

我想要的输出是这样的:

+------------+-------------------+
| student_id | Average           |
+------------+-------------------+
|          1 |             83.25 |
|          4 |             83.75 |
|          6 | 83.66666666666667 | // and how can I make this result shorter like 83.67?
|          7 |                80 |
|          9 |                88 |
|         10 |              80.2 |
|         11 |                80 |
|         12 |                99 |
+------------+-------------------+

我已经尝试了以下代码

mysql> select   student_id, avg(score) as average_score
    -> from     studentscore
    -> group by student_id
    -> where    avg(score) >= 80;

它给了我一个语法错误。

我知道根据规则 where 子句应该放在 group by 子句之前,但我不能,因为 where 子句取决于 group by 子句的结果,如果我切换它们的位置,它会给我另一个错误(“组函数的使用无效")。

谁能告诉我如何得到我想要的桌子?

【问题讨论】:

  • 你在这里使用什么数据库?
  • @TimBiegeleisen 我正在使用 MySQL。
  • @Tim Biegeleisen 抱歉我忘了提

标签: mysql group-by where


【解决方案1】:

用“有”代替“在哪里”

【讨论】:

  • 谢谢!我刚开始学习sql,所以我不知道有一个'有'......
【解决方案2】:

使用having 而不是where。 区别如下:

  1. 您可以在其中编写将应用于每一行的谓词
  2. 您可以编写一个适用于每个组的谓词

在你的情况下,第二个是唯一可行的解​​决方案。

【讨论】:

    【解决方案3】:
    select   student_id, avg(score) as average_score
         from     studentscore
         group by student_id
         having avg(score) >= 80;
    

    【讨论】:

    • 我做到了,先生。我的声望低于 15,因此不会公开显示...
    【解决方案4】:

    where 在分组发生之前对您的数据应用过滤器,而 having 在分组后应用过滤器。 round(,2) 将按照您的要求进行格式化:

    select student_id, round(avg(score), 2) as average_score
    from studentscore
    group by student_id
    having average_score >= 80;
    

    【讨论】:

    • 在 SQL Server 中,您不能在 HAVING 子句中使用选择别名。不过,这在 MySQL 中工作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-11
    • 1970-01-01
    • 2012-04-08
    • 1970-01-01
    • 2017-03-05
    • 2015-06-24
    • 2012-09-01
    相关资源
    最近更新 更多