区分

2012-02-08 38 views
4

当我运行使用group by ... with rollup查询:区分

select a, b, sum(c) 
from <table> 
group by a, b with rollup; 

我得到了重复的行(我认为是)查询的PK(也就是说,在group-by列):

+------+------+--------+ 
| 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, 34)(NULL, NULL, 13)也就是说,如何区分由于基础数据而导致空值的行和因汇总而添加的空值的行? (请注意,有更多的例子 - (2, NULL, 6)(2, NULL, 40)

回答

8

好问题。我能想到的一个选择是要做到这一点:从凯德空肠Roux

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; 
+0

很好的答案,工作得很好。 – eleonzx 2012-09-30 17:43:10

0

回答没有为我工作(MySQL的V5.1),似乎是因版本不一致。提出了MySQL文档注释的方法是唯一可靠的方法我已经看到了:

http://dev.mysql.com/doc/refman/5.6/en/group-by-modifiers.html

发布由Peter Kioko于2012年14:04

6月27日如果你是分组其列数据包含空值,那么结果中的NULL不明确,指明是实际数据值还是滚动行。

为了明确地知道,如果一个行是一个卷起的行或不是你可以使用这一招:

SET @i = 0;

SELECT @i:= @i + 1 AS row_num,year,country,product,SUM(profit)FROM sales GROUP BY year,country,product WITH ROLLUP;

在结果集中,其row_num与前一行的row_num相同的任何行都是一个卷起的行,反之亦然。

+0

在select语句中读取和写入相同的变量是未定义的行为。 – philipxy 2017-11-24 06:26:26