计算得分高于平均分的男性和女性
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 虽然此代码可能会为问题提供解决方案,但最好添加有关其工作原理/方式的上下文。这可以帮助未来的用户学习并将这些知识应用到他们自己的代码中。在解释代码时,您也可能会以赞成票的形式从用户那里获得积极的反馈。以上是关于计算得分高于平均分的男性和女性的主要内容,如果未能解决你的问题,请参考以下文章