在使用“group by ... with rollup”时区分NULL

时间:2012-02-08 20:00:50

标签: mysql sql group-by rollup

使用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)

2 个答案:

答案 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值相同的任何行都是一个累计行,反之亦然。