Top > SQL 関数一覧 (A‐D) > COUNT(集計関数)

レコードの件数、グループ内のレコードの行数、グループ数を求める

syntax

COUNT ( * )
COUNT ( [ DISTINCT | ALL ] expr )
return [ NUMBER ]

parameter

expr任意の式、列名

return

  • グループ内のレコード件数・行数を戻す。

avail

  • SQL でのみ使用可能。(PL/SQL の埋め込み SQL 含む)

COUNT 集計関数の内容

グループにおける 式 expr の行数を戻す。

COUNT 関数の追加説明と注意事項

COUNT 関数にアスタリスク(*)を使用するとグループ内の全レコード数を戻す。
式、または、列名を指定した場合、その式が NULL 値 のものをカウント数に含めない。
さらに DISTINCT を指定すると重複した値の行をカウントに含めない。

多くの場合には GROUP BY 句 を使用せずに全体の行数を取得することが多いが、 グループ単位の行数を求めることも可能。

COUNT の特徴的な使用方法としてはグループ分けされたグループ数を求めるのに COUNT(COUNT(*)) とネストして使用することもできる。

注意

COUNT 関数に 式 を指定した場合、式の値が NULL 値 の場合「未定義」をあらわす。「未定義」は存在しないとして扱われる。しかし、COUNT 関数には NULL を件数に含めるために特別な アスタリスク(*)を使用する構文が用意されており NULL を含めて行数を取得することができる。データが 1件も存在しない場合は「レコードが選択されませんでした」 ではなく 0 を戻す。

COUNT 使用例

COUNT 関数 サンプルデータ
namedeptsalary
鈴木管理部300,000
高橋管理部400,000
佐藤開発部500,000
小林開発部500,000
山本開発部200,000
青木開発部NULL

COUNT(*) と COUNT(expr) と COUNT( DISTINCT expr) の違い。

SQL> select COUNT(*), COUNT(salary), COUNT(distinct salary)
  2   from count_sample;
 
  COUNT(*) COUNT(SALARY) COUNT(DISTINCTSALARY)
---------- ------------- ---------------------
         6             5                     4

部門でグループ分けしたとき、それぞれ件数は…

SQL> select dept, COUNT(*), COUNT(salary) from count_sample group by dept;
 
DEPT           COUNT(*) COUNT(SALARY)
------------ ---------- -------------
管理部                2             2
開発部                4             3

式を指定して NULL に変換した場合:給与が 500,000 円のものは件数に含ませない。
(NULLIF 関数は、このような使い方はしない。WHERE 条件で記述する方法が正しい。)

SQL> select dept, COUNT(nullif(salary, 500000)), COUNT(null)
  2   from count_sample group by dept;
 
DEPT         COUNT(NULLIF(SALARY,500000)) COUNT(NULL)
------------ ---------------------------- -----------
管理部                                  2           0
開発部                                  1           0

NULLIF 関数

条件別にカウントする その1

select dept, trunc(salary/1000),
  COUNT(salary) 
from count_sample group by dept, trunc(salary/1000)
order by dept, trunc(salary/1000);
 
DEPT	 TRUNC(SALARY/1000) COUNT(SALARY)
-------- ------------------ -------------
管理部                  300             1
管理部                  400             1
開発部                  200             1
開発部                  500             2
開発部                                  0

条件別にカウントする その2 (COUNTIF 風)

select dept, 
  COUNT(case when salary >= 500000 then 'X' else null end) ">=500K",
  COUNT(case when salary >= 400000 and salary < 500000 then 'X' else null end) "400K",
  COUNT(case when salary >= 300000 and salary < 400000 then 'X' else null end) "300K",
  COUNT(case when salary >= 200000 and salary < 300000 then 'X' else null end) "200K",
  COUNT(case when salary >= 100000 and salary < 200000 then 'X' else null end) "100K",
  COUNT(case when salary < 100000  then 'X' else null end) "<100K",
  COUNT(case when salary is null then 'X' else null end) "NULL"
from count_sample group by dept;
 
DEPT   >=500K  400K   300K   200K   100K   <100K  NULL
------ ------ ------ ------ ------ ------ ------ ------
管理部      0      1      1      0      0      0      0
開発部      2      0      0      1      0      0      1

カウント関数のカウント = COUNT(COUNT(*))
部門でグループ分けしたとき、いくつにグループ分けされているのか…(管理部と開発部の 2グループ)

SQL> select COUNT(COUNT(*)) from count_sample group by dept;
 
COUNT(COUNT(*))
---------------
              2
 


正規表現にマッチする回数

 
アルファベット別 関数一覧 ショートカット
ABCDEFG
HILMNOP
RSTUVWX
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ Oracle Web セミナー