COUNT 内で条件を指定する方法
COUNT関数は、引数に渡された式の結果がNULLの場合は集計しません。IIF関数を使用し、除外したいレコードの時はNULLを返すことで、条件に一致するレコード件数のみ集計できます。SELECT COUNT(IIF(<ここにカウントしたい条件>, 1, NULL))
FROM <テーブル名>
次のSQLは Point列 が 80 以上のレコード件数を表示します。
SELECT COUNT(IIF([Point] >= 80, 1, NULL)) Point80以上
FROM [SampleTable]
次のSQLは Point列 が 39以下、40~79、80以上のレコード件数を表示します。
SELECT COUNT(IIF([Point] < 40, 1, NULL)) Point39以下
,COUNT(IIF([Point] >= 40 AND [Point] < 80, 1, NULL)) Point40から79
,COUNT(IIF([Point] >= 80, 1, NULL)) Point80以上
FROM [SampleTable]

SUM 関数でカウントする
COUNT関数 の代わりに SUM関数 を使用しても同様の集計ができます。IIF の返す値を 条件一致時に 1、不一致時は 0 を返すようにします。次のSQLは Point列 が 80 以上のレコード件数を表示します。
SELECT SUM(IIF([Point] >= 80, 1, 0)) Point80以上
FROM [SampleTable]
次のSQLは Point列 が 39以下、40~79、80以上のレコード件数を表示します。
SELECT SUM(IIF([Point] < 40, 1, 0)) Point39以下
,SUM(IIF([Point] >= 40 AND [Point] < 80, 1, 0)) Point40から79
,SUM(IIF([Point] >= 80, 1, 0)) Point80以上
FROM [SampleTable]
IIF関数について
IIF関数は 第一引数に 条件を指定でき、条件に一致すれば 第二引数の値を、一致しなければ第三引数の値を返します。IIF は CASE 式の簡略版で、CASE式よりもシンプルに記述できます。IIF(<条件>, <条件が一致したときに返す値>, <条件が一致しないときに返す値>)
IIF関数を CASE 式で置き換えると、次のようになります。
CASE WHEN <条件> THEN <条件が一致したときに返す値> ELSE <条件が一致しないときに返す値> END
参考資料
- Microsoft 公式ドキュメント - COUNT(Transact-SQL)
- Microsoft 公式ドキュメント - 論理関数 - IIF(Transact-SQL)
- Microsoft 公式ドキュメント - SUM(Transact-SQL) (Transact-SQL)
検証環境
- Microsoft SQL Server 2022 (RTM-CU5) (KB5026806) - 16.0.4045.3 (X64) May 26 2023 12:52:08 Copyright (C) 2022 Microsoft Corporation Express Edition (64-bit) on Linux (Ubuntu 20.04.6 LTS) <X64>
- Docker image: mcr.microsoft.com/mssql/server:2022-latest
- Docker Desktop 4.21.1(114176)
- Docker Compose v2.19.1
- Docker Engine 24.0.2
- Microsoft SQL Server Management Studio v19.0.1(19.0.20200.0+9286509b)
- Windows 10 Enterprise Version 22H2 OS Build 19045.3086 Experience: Windows Feature Experience Pack 1000.19041.1000.0