我在特定查询中使用ROLLUP并将其作为结果返回:
sex avgAge
Female 54
Male 49
Male 52
我的问题是......为什么第三栏中有男性?它不应该有NULL吗?
查询:
SELECT sex, COUNT(1) AS avgAge
FROM people
GROUP BY IFNULL(sex,'')
WITH ROLLUP
答案 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列表中表达式的别名,而不是表中的列。