Различают NULL при использовании «group by ... with rollup» - PullRequest
4 голосов
/ 09 февраля 2012

Когда я запускаю запрос, используя 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 из-за базовых данных, и строка, которая имеет значения NULL, поскольку она была добавлена ​​с помощью накопительного пакета?(Обратите внимание, что есть и другие примеры - (2, NULL, 6) и (2, NULL, 40))

Ответы [ 2 ]

8 голосов
/ 09 февраля 2012

Хороший вопрос.Один вариант, который я могу придумать, это сделать:

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 голосов
/ 19 января 2013

Ответ от Cade Roux не работает для меня (MySQL v5.1) и кажется несовместимым от версии к версии.Метод, предложенный в комментариях к документации MySQL, является единственным надежным методом, который я видел:

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

Автор: Peter Kioko, 27 июня 2012 г. 2:04 pm

Если вы группируете столбец, данные которого содержат NULL, то значение NULL в результатах будет неоднозначным относительно того, обозначает ли оно фактическое значение данных или свернутую строку.

Чтобы окончательно узнать, является ли строкаэто свернутая строка или нет, вы можете использовать этот трюк:

SET @i = 0;

SELECT @i: = @i + 1 AS row_num, год, страна, продукт,SUM (прибыль) FROM sales GROUP BY год, страна, продукт WITH ROLLUP;

В результирующем наборе любая строка, значение row_num которой совпадает со значением row_num предыдущей строки, представляет собой свернутую строку и наоборот.наоборот.

...