0

我正在使用 Chartio 创建图表,我需要从我的 MySQL 数据库中检索一些计算值。

只有一个表,它包含几个包含成绩的列(这是从 CSV 导入的,因此它是一个“平面数据库”)。列名如下:1a_grade、1b_grade、1c_grade、2a_grade 等。

每个等级的值可以是“0”、“1”、“2”、“3”和“-”。

我想返回一个如下所示的表:

+-----------+-------+-------+
| GradeName | Grade | Count |
+-----------+-------+-------+
| 1A        | 0     |     4 |
| 1A        | 1     |     9 |
| 1A        | 2     |     2 |
| 1A        | 3     |     8 |
| 1A        | -     |    19 |
| 1B        | 0     |     6 |
| 1B        | 1     |     2 |
| 1B        | 2     |     8 |
| 1B        | 3     |    10 |
| 1B        | -     |    24 |
+-----------+-------+-------+

(这里的计数只是随机数)

我希望以这种方式格式化表格的原因是因为(据我所知)这是使 Chartio 正确绘制图表且轴位于正确位置的唯一方法......

到目前为止,我想出了:

SELECT 1a_grade, COUNT(*)
FROM opc_protocol
GROUP BY 1a_grade;

这给了我:

+----------+----------+
| 1a_grade | COUNT(*) |
+----------+----------+
| -        |        1 |
| 0        |        6 |
| 1        |       32 |
+----------+----------+

(实际计数)

问题是,因为我还没有值为“2”或“3”的条目,所以当我 GROUP BY 1a_grade 时,我没有得到它们的行。我想按文字“0”、“1”、“2”、“3”和“-”进行分组。

另一个问题是我没有在列中获得 GradeName。

第三个问题是我无法获得多个成绩:)

有谁知道这是否可以做到?

问候,
延斯

4

1 回答 1

1

我会使用的技巧是 UNION 与每列的一系列查询。有点乏味,但它的工作原理。我通过使用您建议的列(1a_grade、1b_grade、1c_grade、2a_grade、2b_grade、2c_grade)创建一个等级表,在 mySQL 中重现了您的问题。然后我用大约 70 条记录填充它,每列中的数据值模式有些随机(来自值域:-、0、1、2、3)。

然后我构造了以下查询来显示您的输出格式:

SELECT '1A' as grade_name, `1a_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '1A', `1a_grade`
UNION ALL
SELECT '1B' as grade_name, `1b_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '1B', `1b_grade`
UNION ALL
SELECT '1C' as grade_name, `1c_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '1C', `1c_grade`
UNION ALL
SELECT '2A' as grade_name, `2a_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '2A', `2a_grade`
UNION ALL
SELECT '2B' as grade_name, `2b_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '2B', `2b_grade`
UNION ALL
SELECT '2C' as grade_name, `2c_grade` as `grade`, count(*) as `count`
    FROM grade
    GROUP BY '2C', `2c_grade`

它使用 3 列(grade_name、grade、count)生成了您想要的输出格式。

我希望这有帮助。

于 2013-05-20T19:58:36.653 回答