意外我ROLLUP做一个特定的查询,并把它恢复为结果:WITH ROLLUP行为
sex avgAge
Female 54
Male 49
Male 52
我的问题是...为什么第三列有男的呢?它不应该有NULL吗?
查询:
SELECT sex, COUNT(1) AS avgAge
FROM people
GROUP BY IFNULL(sex,'')
WITH ROLLUP
意外我ROLLUP做一个特定的查询,并把它恢复为结果:WITH ROLLUP行为
sex avgAge
Female 54
Male 49
Male 52
我的问题是...为什么第三列有男的呢?它不应该有NULL吗?
查询:
SELECT sex, COUNT(1) AS avgAge
FROM people
GROUP BY IFNULL(sex,'')
WITH ROLLUP
问题是最有可能的是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
要在汇总(“超总量”)行的第一列中得到一个空,你需要这样的事:
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列表中,而不是表中的列。
显示查询? – Patashu
请发布[SSCCE](http://sscce.org/)。 –
添加查询.. – neubert