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 を戻す。
ただし group by の併用や 分析関数の COUNT の場合には結果は 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
COUNT 関数の違いの内容
namedeptsalaryCOUNT(*)COUNT(salary)COUNT
(distinct salary)
鈴木管理部300,000111
高橋管理部400,000222
佐藤開発部500,000333
小林開発部500,00044
山本開発部200,000554
青木開発部NULL6--
結果--654

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

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 関数

部門別に給与が 200,000 円以下の件数をカウントする(その1)

select dept, COUNT(salary), count(*) from count_sample
where salary <= 200000 group by dept;
 
DEPT	 COUNT(SALARY)	 COUNT(*)
-------- ------------- ----------
開発部               1          1

部門別に給与が 200,000 円以下の件数をカウントする(その2)
データとして存在しないが「製造部」という部門が存在している場合には部門一覧などとの外部結合が必要

select dept, COUNT(salary), count(salary2), count(*) from (
  select dept,
    case when salary > 200000 then null else salary end salary,
    case when lnnvl(salary <= 200000) then null else salary end salary2
  from count_sample
)
group by dept;
 
DEPT	 COUNT(SALARY) COUNT(SALARY2)	COUNT(*)
-------- ------------- -------------- ----------
管理部               0              0          2
開発部               1              1          4

条件別にカウントする その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
日本オラクル
■ 日本オラクル 株式会社
■ オラクルマスター資格 (オラクルマスターとは
■ オラクルサポートセンター