使用空时区分空"group by ... with 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)也就是说,我如何区分因为底层数据而具有null的行和因为它是通过汇总添加的而具有nulls的行?(注意还有更多的例子——(2, NULL, 6)(2, NULL, 40)

好问题。我能想到的一个选择是这样做:

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;

Cade Roux的Answer对我不起作用(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;

选择@i:=@i+1作为row_num、年份、国家/地区、产品、销售组的总和(利润)(按年份、国家或地区、产品);

在结果集中,row_num与前一行的row_num值相同的任何行都是汇总行,反之亦然。

最新更新