如何解决对没有相同列的行组执行联合尝试生成空的直方图箱
我正在使用 MySQL。
我有一张表 grades
,看起来像这样:
course_id grade
101 90
101 100
101 100
102 92
102 85
102 90
我有一个视图,可以使用以下查询为每个班级计算每个 bin 中的成绩数。
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
... ... ...
所以 bin 增加 5,从 40 开始,到 100 停止。我的想法是为空 bin 制作一个表格,插入每个成绩 bin 并计数为 0,然后使用 UNION
但我可以不让 UNION
工作,因为我在空 bin 表中没有 course_id
列(我也不想 - 有很多,它们可以改变)。我将如何为每组 course_ids
做 UNION?
解决方法
从一个 bin 列表开始。然后使用 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
表,该表大概也可用。
假设您创建的表 bin_table
只有 1 列 grade_bin
,值为 40,45,50,....,100 并且您有一个表 cources
使用列 course_id
作为主键,您所要做的就是 CROSS
连接这些表并 LEFT
连接到在表 ranked_grades
上聚合的查询(不需要子查询):
SELECT c.course_id,b.grade_bin,COALESCE(t.count,0) AS count
FROM bin_table b CROSS JOIN cources c
LEFT JOIN (
SELECT course_id,FLOOR(grade / 5.00) * 5 AS grade_bin,COUNT(*) AS count
FROM ranked_grades
GROUP BY course_id,grade_bin
) t ON (t.course_id,t.grade_bin) = (c.course_id,b.grade_bin)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。