どうもcount()
の返す答えが分かっていないかも
例えばこのような
[salary_sample]
name | dept | salary |
---|---|---|
鈴木 | 管理部 | 300000 |
高橋 | 管理部 | 400000 |
佐藤 | 開発部 | 500000 |
小林 | 開発部 | 500000 |
山本 | 開発部 | 200000 |
青木 | 開発部 | |
鈴木 | 開発部 | 400000 |
というテーブルがあって
SELECT
count(*)
, count(salary)
, count(DISTINCT salary)
FROM
salary_sample;
としてやると
COUNT(*) | COUNT(SALARY) | COUNT(DISTINCTSALARY) |
---|---|---|
7 | 6 | 4 |
という結果が得られる。
複数の条件で集計をしてみると
SELECT
dept
, salary
, COUNT(*)
, COUNT(salary)
, count(dept)
, count(name)
FROM
salary_sample
GROUP BY
dept
, salary;
DEPT | SALARY | COUNT(*) | COUNT(SALARY) | COUNT(DEPT) | COUNT(NAME) |
---|---|---|---|---|---|
管理部 | 300000 | 1 | 1 | 1 | 1 |
開発部 | 1 | 0 | 1 | 1 | |
開発部 | 400000 | 1 | 1 | 1 | 1 |
開発部 | 500000 | 2 | 2 | 2 | 2 |
管理部 | 400000 | 1 | 1 | 1 | 1 |
開発部 | 200000 | 1 | 1 | 1 | 1 |
これらの結果から |
count(*) nullも含めてその行数を返す
count(カラム名) そのカラムのnull以外の記述のある行数を返す
※ただし、集計するカラム以外も指定することができる
(ここらへんがなぜそうなっているのかが不思議だが)
ということで 本題のgroup by
で複数条件を集約し、そのグループ内の件数を出したい時は
SELECT
カラム1
, カラム2
, count(カラム1) -----nullが含まれていないカラムを指定
FROM
テーブル
GROUP BY
カラム1
, カラム2
としてやるのが無難なのかな
別ブログに掲載していた記事をQiitaに掲載
しかしこの元記事 細々とアクセスされているのだけど、なんでだろう