mysql - 对没有相同列的行组执行联合。试图生成空的直方图箱
问题描述
我正在使用 MySQL。
我有一张桌子grades
,看起来像这样:
course_id grade
101 90
101 100
101 100
102 92
102 85
102 90
我有一个视图,可以使用以下查询计算每个班级的每个班级有多少成绩。
SELECT
*,
COUNT(grade_bin) as count
FROM
(SELECT
course_id,
FLOOR(grade/5.00)*5 AS grade_bin
FROM ranked_grades) as t
GROUP BY course_id, grade_bin
ORDER BY course_id, grade_bin ASC;
这将返回:
course_id grade_bin count
101 90 1
101 100 2
102 85 1
102 90 2
我想在此视图中添加空箱,如下所示:
course_id grade_bin count
101 40 0
101 45 0
... ... ...
101 100 2
102 40 0
... ... ...
所以垃圾箱增加 5,从 40 开始,到 100 停止。我的想法是为空垃圾箱制作一张表,插入每个等级垃圾箱和 0 计数,然后使用UNION
但我无法UNION
工作,因为我没有course_id
空 bin 表中的列(我也不想 - 有很多,他们可以改变)。我将如何为每组做一个 UNION course_ids
?
解决方案
从垃圾箱列表开始。然后用于cross join
生成所有行。最后,加入现有数据。
所以:
SELECT c.course_id, gb.grade_bin, COUNT(rg.course_id) as cnt
FROM (SELECT 40 as grade_bin UNION ALL
SELECT 45 as grade_bin UNION ALL
SELECT 50 as grade_bin UNION ALL
. . .
SELECT 100 as grade_bin
) gb CROSS JOIN
(SELECT DISTINCT course_id
FROM ranked_grades
) c LEFT JOIN
ranked_grades rg
ON rg.course_id = c.course_id AND
rg.grade >= gb.grade_bin AND
rg.grade < gb.grade_bin + 5
GROUP BY c.course_id, gb.grade_bin;
ranked_grades
注意:这将从表中检索课程。您还可以使用courses
可能也可用的表。
推荐阅读
- python - 我无法通过python在word文件上应用查找和替换功能
- c# - 如何解析具有相同标签名称的 XML
- angularjs - 表单数据未附加文件对象
- origen-sdk - Origen Git API 和 test_ids gem 是否可配置为使用 master 以外的分支?
- c# - Xamarin 表单基于多个值绑定 Bool
- angular - Angular Universal:当路由具有查询参数时服务不可用
- sql-server - 如何使用 SQL 身份验证以“本地管理员”身份运行的应用程序连接到远程数据库,而服务器上没有“系统管理员”权限
- sql - 连接和子查询
- azure - 如何在单容器模式下在 Azure 应用服务上使用 webhook
- python - 在 TensorFlow 中使用 Pandas Dataframe - X 和 Y 值