使用group by ... with rollup
运行查询时:
select a, b, sum(c)
from <table>
group by a, b with rollup;
我在(我认为是)查询的PK(即分组列)中获得了重复的行:
+------+------+--------+
| a | b | sum(c) |
+------+------+--------+
| NULL | NULL | 13 |
| NULL | 1 | 4 |
| NULL | 3 | 8 |
| NULL | 4 | 9 |
| NULL | NULL | 34 |
| 1 | 3 | 17 |
| 1 | 4 | NULL |
| 1 | 17 | 2 |
| 1 | NULL | 19 |
| 2 | NULL | 6 |
| 2 | 1 | 17 |
| 2 | 3 | 17 |
| 2 | NULL | 40 |
| 4 | 17 | 2 |
| 4 | NULL | 2 |
| 5 | NULL | 11 |
| 5 | 6 | 7 |
| 5 | NULL | 18 |
| 13 | 4 | 2 |
| 13 | NULL | 2 |
| 14 | 41 | 3 |
| 14 | NULL | 3 |
| 18 | 1 | 2 |
| 18 | NULL | 2 |
| 41 | 2 | 17 |
| 41 | NULL | 17 |
...更多行跟随......
如何区分(NULL, NULL, 13)
与(NULL, NULL, 34)
?也就是说,如何区分由于基础数据而具有空值的行与具有该行的行nulls因为它是由汇总添加的? (请注意,还有更多示例 - (2, NULL, 6)
和(2, NULL, 40)
)
答案 0 :(得分:8)
好问题。我能想到的一个选择是:
select COALESCE(a, -1) AS a, COALESCE(b, -1) AS b, sum(c)
from <table>
group by COALESCE(a, -1), COALESCE(b, -1) with rollup;
答案 1 :(得分:0)
来自Cade Roux的回答对我不起作用(MySQL v5.1),并且从版本到版本似乎不一致。关于MySQL文档注释的方法是我见过的唯一可靠的方法:
http://dev.mysql.com/doc/refman/5.6/en/group-by-modifiers.html
Peter Kioko于2012年6月27日下午2:04发表
如果要对其数据包含NULL的列进行分组,那么结果中的NULL将不明确它是指定实际数据值还是汇总行。
为了明确知道某行是否为累积行,您可以使用此技巧:
SET @i = 0;
SELECT @i:= @i + 1 AS row_num,year,country,product,SUM(profit)FROM sales GROUP BY年份,国家/地区,产品WITH ROLLUP;
在结果集中,row_num与前一行的row_num值相同的任何行都是一个累计行,反之亦然。