按某列分组计算正负值数量的MySQL查询

4

我有一个mysql表的以下布局:

+------+-------+-----+------+
| user |subject|month|change|
+------+-------+-----+------+
|Donald| Math  | Jan | 3.15 |
+------+-------+-----+------+
| Mike | Math  | Jan | 2.15 |
+------+-------+-----+------+
|Regan | Math  | Jan | 3.00 |
+------+-------+-----+------+
|Donald| Engl  | Febr|-3.05 |
+------+-------+-----+------+
| Mike | Engl  | Febr| 3.00 |
+------+-------+-----+------+
|Regan | Engl  | Febr|-3.00 |
+------+-------+-----+------+
|Donald| Geog  | Jan | 3.00 |
+------+-------+-----+------+
| Mike | Geog  | Jan |-2.15 |
+------+-------+-----+------+
|Regan | Geog  | Jan | 3.60 |
+------+-------+-----+------+

我需要按照科目统计正负变化的组,并获取该组的名称。如果我像这样查询mysql表:

COUNT (*) FROM $table WHERE change>0 GROUP BY subject

它只会统计每个科目列中正数变化的数量(>0)。无法获取负数变化(<0)和获取组名(Math、Eng和Geog)的数量。

我希望结果应该像这样:

===============
Group | >0| <0|
===============
 Math | 3 | 0 | 
---------------
 Eng  | 1 | 2 |
---------------
 Geog | 2 | 1 |
---------------

有什么单一的mysql查询可以得到像上面那样的结果吗?
1个回答

8
下面的查询将按subject分组记录。MySQL支持布尔运算,因为a.change > 0对于真返回1,对于假返回0。
SELECT  a.Subject,
        SUM(a.change > 0) `> 0`,
        SUM(a.change < 0) `< 0`
FROM    tableName a
GROUP   BY a.Subject

注意,它不包括 change = 0 的主题。


请问您能否解释一下这段代码,并说明如何获取结果? - stockBoi
请注意,我不想得到正或负变化的总和,而是要得到正或负变化发生的次数。 - stockBoi
这正是查询返回的内容。点击SQL Fiddle链接查看结果。 - John Woo
sqlfiddle中的mysql是不区分大小写的。 - John Woo
2
简单,优雅。好答案。 - Floris
显示剩余2条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接