2013-01-25 32 views
0

意外我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 
+2

显示查询? – Patashu

+0

请发布[SSCCE](http://sscce.org/)。 –

+0

添加查询.. – neubert

回答

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


要在汇总(“超总量”)行的第一列中得到一个空,你需要这样的事:

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列表中,而不是表中的列。