0

我对特定查询执行 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
4

1 回答 1

2

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

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

<剪辑>

每个超聚合行中的 NULL 指示符是在将行发送到客户端时生成的。服务器查看在 GROUP BY 子句中命名的列,紧随最左边的已更改值的列。对于结果集中具有与这些名称中的任何一个词法匹配的名称的任何列,其值设置为 NULL。(如果您指定按列号对列进行分组,则服务器会按编号确定将哪些列设置为 NULL。)

</snip>

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


我们还注意到,您提供的查询不是产生该结果集的查询。我们注意到别名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 列表中的表达式的别名,而不是表中的列。

于 2013-01-25T06:03:03.043 回答