在MySql中跨两个维度对数据进行分组

时间:2017-09-20 20:32:14

标签: mysql sql

我是一个MySql(和Sql)菜鸟,所以原谅问题的模糊性。请询问您是否需要澄清。我将提供一个有点人为的例子来说明问题。

假设我有一个学校数据库。学校将组织年度体育日,有关谁参加活动的信息存储在如下表格中:

+---------------+-------+------------+
| signup_status | grade | student_id |
+---------------+-------+------------+
|     True      |   1   |    1001    |
|     True      |   2   |    2010    |
|     True      |   1   |    1101    |
|     True      |   2   |    2002    |
|     False     |   1   |    1012    |
+---------------+-------+------------+

现在,学校希望按年级分列有多少孩子报名参加活动。所以他们希望看到这样的东西:

+----------------+----------------------------+
| Grade / Status | Signed up | Didn't sign up |
+----------------+-----------+----------------+
|       1        |     2     |        1       |
|       2        |     2     |        0       |
+----------------+-----------+----------------+

我知道我可以运行像

这样的东西
SELECT count(`student_id`) as `count`, IF(`status`, 'Yes', 'No') as `signed_up`, `grade`
GROUP BY `grade`, `signed_up`
ORDER BY `grade` ASC

得到这个:

+-----------+---------------+-----------+
|   Count   |   Signed up   |   Grade   |
+-----------+---------------+-----------+
|     2     |      Yes      |     1     |
|     1     |      No       |     1     |
|     2     |      Yes      |     2     |
|     0     |      No       |     2     |
+-----------+---------------+-----------+

我的问题是,如上所述,我如何从这里走到我想要的地方?

提前致谢。

1 个答案:

答案 0 :(得分:1)

使用条件聚合:

select grade, sum(status) as signedup, sum(not status)
from t
group by grade;

MySQL将布尔值视为数字上下文中的数字,“1”表示true,“0”表示false。