意外的WITH ROLLUP行为

时间:2013-01-25 05:17:29

标签: mysql

我在特定查询中使用ROLLUP并将其作为结果返回:

sex       avgAge
Female    54
Male      49
Male      52

我的问题是......为什么第三栏中有男性?它不应该有NULL吗?

查询:

SELECT sex, COUNT(1) AS avgAge
FROM people
GROUP BY IFNULL(sex,'')
WITH ROLLUP

1 个答案:

答案 0 :(得分:2)

问题很可能是GROUP BY子句中的表达式与SELECT列表中的列名不匹配。

摘自http://dev.mysql.com/doc/refman/5.5/en/group-by-modifiers.html

<剪断>

将行发送到客户端时,会生成每个超级聚合行中的NULL指示符。服务器查看GROUP BY子句中指定的列,这些列位于最左侧的已更改值的子句之后。对于结果集中的任何列,其名称与任何这些名称的词汇匹配,其值设置为NULL。 (如果按列号指定分组列,则服务器会按编号标识要设置为NULL的列。)

< /剪断>

因此,简短的回答是,GROUP BY子句中的表达式与结果集中列的名称之间没有“词汇匹配”,因此超级聚合行中该列的值为没有设置为NULL。


我们还注意到您提供的查询不是生成该结果集的查询。我们注意到别名avgAge未分配给第二列,汇总行中的值似乎是AVG聚合的结果,而不是COUNT聚合的结果。对于COUNT聚合,我们预计汇总值为103。


要在该汇总(“超级聚合”)行的第一列中获取NULL,您需要这样的内容:

SELECT t.sex, COUNT(1) AS cnt
  FROM people t
 GROUP BY t.sex
  WITH ROLLUP

如果你想像空字符串一样处理NULL值,那么像这样:

SELECT IFNULL(t.sex,'') AS sex, COUNT(1) AS cnt
  FROM people t
 GROUP BY sex
  WITH ROLLUP

请注意,GROUP BY中的名称引用分配给SELECT列表中表达式的别名,而不是表中的列。