【问题标题】:How to count records with averages in range如何计算范围内平均值的记录
【发布时间】:2021-08-21 16:00:26
【问题描述】:

我需要计算平均成绩从 7.6 到 8.3 的学生人数 我试过了

Select count(*) from tabele
Where AVG(grade)> 7.6
and AVG(Grade)<8.3 
Group by id

但总是有错误

【问题讨论】:

  • 您必须首先获得平均值,然后才能计算它们。你不能在同一时间/级别上做。
  • 您使用的是哪个 dbms?

标签: sql count average


【解决方案1】:

下面的方法是首先按学生id 汇总,并在HAVING 子句中声明平均成绩要求。然后,通过子查询来查找匹配学生的数量。

SELECT COUNT(*)
FROM
(
    SELECT id
    FROM yourTable
    GROUP BY id
    HAVING AVG(Grade) > 7.6 AND AVG(Grade) < 8.3
) t;

假设您的 RDBMS 支持窗口函数,以下是我们可以通过单个查询获取计数的一种方法:

SELECT DISTINCT COUNT(*) OVER () AS total_cnt
FROM yourTable
GROUP BY id
HAVING AVG(Grade) > 7.6 AND AVG(Grade) < 8.3;

【讨论】:

    【解决方案2】:

    你应该在这里使用having子句而不是where。 sum(count(distinct id)) 也可用于计算值的数量。或者,您可以使用子查询来获得相同的结果。

    select sum(count(distinct id)) from table_name
    group by id
    having AVG(grade) BETWEEN  7.6 and 8.3;
    

    【讨论】:

    • 1) HAVING 出现在 GROUP BY 之后。
    • @jarlh 是的。在 oracle 中这无关紧要,但提出问题的人确实可以使用不同的 dbms。
    • 太棒了,以前从未听说过这个!
    【解决方案3】:

    这样的事情应该可以工作

        WITH _CTE AS 
    (
        SELECT StudentId, AVG(Grade) as avgGrade
        FROM MyTalbe
        GROUP BY StudentId
    )
    SELECT COUNT(*)
    FROM _CTE
    WHERE avgGrade > 7.6
    AND avgGrade < 8.3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-11-09
      • 1970-01-01
      • 1970-01-01
      • 2020-11-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多