0

特定のクエリで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
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 に設定するかを番号で識別します。)

</中略>

したがって、短い答えは、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 リスト内の式に割り当てられたエイリアスを参照することに注意してください。

于 2013-01-25T06:03:03.043 に答える