LoginSignup
40
41

More than 5 years have passed since last update.

sql group by で複数条件を集約し、そのグループ内の件数を出したい

Last updated at Posted at 2017-08-06

どうも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に掲載
しかしこの元記事 細々とアクセスされているのだけど、なんでだろう

40
41
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
40
41