首页 > 解决方案 > 对没有相同列的行组执行联合。试图生成空的直方图箱

问题描述

我正在使用 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

标签: mysqlsqlleft-joinunioncross-join

解决方案


从垃圾箱列表开始。然后用于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可能也可用的表。


推荐阅读