计算得分高于平均分的男性和女性

Posted

技术标签:

【中文标题】计算得分高于平均分的男性和女性【英文标题】:Count Male and Female who scored greater than average marks 【发布时间】:2020-12-11 14:32:39 【问题描述】:

这个问题是在练习测试中提出的,我是 SQL 新手。

问题是确定男女学生的平均分数。此外,您还需要确定分数高于其性别平均水平的学生人数。

表格说明:

=======================
| Field    |  Type    |  
=======================
| RollNo   |  int     |
| Name     |  text    |
| Gender   |  text    |
| Score    |  text    |
=======================

示例输入:

=========================================
| RollNo   |  Name   | Gender |  Score  |
=========================================
| 101      |  John   |   M    |  85     |
| 102      |  Tracy  |   F    |  79     |
| 103      |  Jake   |   M    |  92     |
| 104      |  Edgar  |   M    |         |
| 105      |  Monica |   F    |  25     |
| 106      |  Alicia |   F    |  50     |
| 107      |  Yash   |   M    |  68     |
=========================================

输出:

=================================
| Gender   |  Count |  AvgScore |
=================================
| Female   |  1     |   51      |
| Male     |  2     |   81      |
=================================

输出解释: 有 4 名男学生,但 1 名学生没有尝试,因此我们忽略了该空值。 所以男性的平均得分是(85 + 92 + 68)/3 = 81.67(只取整数值) 81分以上的学生只有2人

这个我只是为了计算男性和女性的数量而尝试的:

SELECT
CASE WHEN S.Gender="M" then "Male" else "Female" END AS Gender
COUNT(Gender) as Count
FROM Students AS S
GROUP BY Gender

我不知道在哪里放置AVG 函数。我应该使用嵌套查询吗?或者有什么我可以预先查询平均值然后与每一行进行比较的吗?

【问题讨论】:

您使用的是 mysql 还是 MS SQL Server? 我正在使用 MySQL 【参考方案1】:

您需要进行两次计算。首先是确定您需要的平均值。第二个是检索具有这些平均值的行。您需要的技巧是使用子查询进行第一次计算,然后将其加入第二次计算。

这是第一个被表述为子查询的计算。

               SELECT Gender, AVG(Score) AvgScore
                 FROM scores
                GROUP BY Gender

这需要像这样加入您的详细信息。

   SELECT avg.Gender, avg.AvgScore,
          SUM(scores.Score > avg.AvgScore) AboveAverageCount
     FROM (
               SELECT Gender, AVG(Score) AvgScore
                 FROM scores
                GROUP BY Gender
          ) avg
     JOIN scores ON avg.Gender = scores.Gender
    GROUP BY Gender

看到这个。 https://www.db-fiddle.com/f/jTWnYkAzRfMVkdkM3ve68R/0

AVG() 函数自动省略 NULL 值。

我建议的SUM() 有效,因为像score > AvgScore 这样的比较表达式的值为1 表示真,或0 表示假。这是 MySQL 的一个怪癖,不适用于其他 SQL 方言。

【讨论】:

感谢您清晰明了的解释。【参考方案2】:

选择语句中应包含 AVG 以及性别。例如

SELECT 
  S.Gender,
  a.avg_score,
  SUM(S.score > a.avg_score) as counts
FROM scores S
LEFT JOIN 
(
  SELECT
     Gender,
     AVG(S.Score) AS avg_score
  FROM scores AS S
  GROUP BY S.Gender) a
USING(Gender)
WHERE S.Score IS NOT NULL
GROUP BY 1,2 

【讨论】:

它给了我错误的答案。它正在计算男性和女性的总数。 https://www.db-fiddle.com/f/emK7DYnhwzbwh8Q4UjQJFr/0 你说得对,我已经更新了查询。我错过了计数应该只计算高于性别平均值的那些【参考方案3】:

您可以使用解析函数avg如下:

Select gender,
       Count(case when score > avg_score_gender then 1 end) as cnt,
       avg_score_gender as avg_score
(Select t.*,
       Avg(score) over (partition by gender) as avg_score_gender
  From t) t
Group by gender, avg_score_gender

【讨论】:

这对我来说是新方法。我收到错误here。你能帮我学习一些新东西吗? :)【参考方案4】:
   SELECT CASE WHEN scores.Gender="M" then "Male" else "Female" END AS Gender,
          SUM(scores.Score > avg.AvgScore) Count, floor(avg.AvgScore) as avgScore
     FROM (
               SELECT Gender, AVG(Score) AvgScore
                 FROM scores
                GROUP BY Gender
          ) avg
     JOIN scores ON avg.Gender = scores.Gender
    GROUP BY scores.Gender order by avg.AvgScore ASC
    

【讨论】:

只取整数部分使用floor方法,升序使用order by 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。

以上是关于计算得分高于平均分的男性和女性的主要内容,如果未能解决你的问题,请参考以下文章

正态分布预测女性高于男性!

我想从子查询的结果中计算男性和女性的总数。有没有mysql查询

如何获得所有女性?

如何利用字典计算数据框中的多个平均值

计算百分比,包括小计作为 Power BI 中的度量

体脂率怎么计算