區分

2012-02-08 35 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