特定のクエリでWITHROLLUPを実行すると、結果としてこれが返されます。
sex avgAge
Female 54
Male 49
Male 52
私の質問は...なぜ3番目の列に男性が含まれているのですか?NULLにするべきではありませんか?
クエリ:
SELECT sex, COUNT(1) AS avgAge
FROM people
GROUP BY IFNULL(sex,'')
WITH ROLLUP
特定のクエリでWITHROLLUPを実行すると、結果としてこれが返されます。
sex avgAge
Female 54
Male 49
Male 52
私の質問は...なぜ3番目の列に男性が含まれているのですか?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 句の式と結果セットの列の名前の間に「字句一致」がないため、超集約行のその列の値が設定されていないということです。ヌルに。
また、提供するクエリは、その結果セットを生成するクエリではないことにも注意してください。エイリアスavgAge
が 2 番目の列に割り当てられておらず、ロールアップ行の値が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 リスト内の式に割り当てられたエイリアスを参照することに注意してください。