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