【发布时间】:2022-01-02 16:56:14
【问题描述】:
您将如何改进 SQL Server 中的以下查询以查找哪些课程中的男女比例超过 70%? (我添加了所有相关表格的图表......并非所有表格都是必需的)
SELECT
F.CourseId,
CAST(ROUND(CAST(M.Men AS FLOAT) / CAST(F.Women AS FLOAT) * 100, 2) AS NUMERIC(12, 2)) AS Ratio
FROM
(SELECT
c.CourseId, COUNT(DISTINCT c.StudentId) AS Women
FROM
Classrooms c
INNER JOIN
Students s ON c.StudentId = s.StudentId
WHERE
s.Gender = 'F'
GROUP BY
c.CourseId) F
INNER JOIN
(SELECT
c.CourseId, COUNT(DISTINCT c.StudentId) AS Men
FROM
Classrooms c
INNER JOIN
Students s ON c.StudentId = s.StudentId
WHERE
s.Gender = 'M'
GROUP BY
c.CourseId) M ON F.CourseId = M.CourseId
WHERE
CAST(M.Men AS FLOAT) / CAST(F.Women AS FLOAT) * 100 > 70
ORDER BY
F.CourseId
我想练习有效且更短(更好)的查询。
谢谢大家!
【问题讨论】:
-
为什么要将
COUNTs 转换为float? -
请提供表结构和示例数据作为SQL语句。 minimal reproducible example
-
您可以一次有条件地统计男性、女性。
标签: sql sql-server aggregate-functions