SQL Serverでは、 COUNT()
関数は、グループ内で見つかったアイテムの数を返します。これを使用して、テーブルまたは結果セットに含まれる行数を確認できます。
構文
構文は次のようになります:
-- Aggregation Function Syntax COUNT ( { [ [ ALL | DISTINCT ] expression ] | * } ) -- Analytic Function Syntax COUNT ( [ ALL ] { expression | * } ) OVER ( [>] )
ALL
集計関数をすべての値に適用します。これがデフォルト値です。
DISTINCT
関数が一意のnull以外の値の数を返すことを指定します。
式
画像を除くすべてのタイプの式です 、 ntext 、またはテキスト 。集計関数とサブクエリは、式ではサポートされていません。
*コード> 重複する行、およびnull値を含む行を含め、すべての行をカウントして返す必要があることを指定します。
COUNT(*)
パラメータを受け取らず、 DISTINCT
の使用をサポートしていません 。また、式も必要ありません パラメータ(特定の列に関する情報を使用しないため)。
OVER([
FROM
によって生成された結果セットを分割します 関数が適用されるパーティションへの句。指定しない場合、関数はクエリ結果セットのすべての行を単一のグループとして扱います。
例1-基本的な使用法
この関数がどのように機能するかを示す基本的な例を次に示します。
SELECT COUNT(*) AS 'Row Count' FROM Artists;
結果:
+-------------+ | Row Count | |-------------| | 16 | +-------------+
この場合、 Artists には16行あります。 テーブル。
念のために言っておきますが、ここにあります:
SELECT * FROM Artists;
結果:
+------------+------------------------+--------------+-------------+ | ArtistId | ArtistName | ActiveFrom | CountryId | |------------+------------------------+--------------+-------------| | 1 | Iron Maiden | 1975-12-25 | NULL | | 2 | AC/DC | 1973-01-11 | NULL | | 3 | Allan Holdsworth | 1969-01-01 | NULL | | 4 | Buddy Rich | 1919-01-01 | NULL | | 5 | Devin Townsend | 1993-01-01 | NULL | | 6 | Jim Reeves | 1948-01-01 | NULL | | 7 | Tom Jones | 1963-01-01 | NULL | | 8 | Maroon 5 | 1994-01-01 | NULL | | 9 | The Script | 2001-01-01 | NULL | | 10 | Lit | 1988-06-26 | NULL | | 11 | Black Sabbath | 1968-01-01 | NULL | | 12 | Michael Learns to Rock | 1988-03-15 | NULL | | 13 | Carabao | 1981-01-01 | NULL | | 14 | Karnivool | 1997-01-01 | NULL | | 15 | Birds of Tokyo | 2004-01-01 | NULL | | 16 | Bodyjar | 1990-01-01 | NULL | +------------+------------------------+--------------+-------------+
予想どおり、16行が返されます。
CountryId に注意してください 列にはnull値しか含まれていません。これは次の例で役立ちます。
例2–列を指定する
前の例では、アスタリスク( *
)を使用しました )すべての行を指定します。これにより、重複があるかどうか、またはnull値が含まれているかどうかに関係なく、すべての行がカウントされます。
特定の列を指定することもできます。これを行うと、null値はカウントされません。つまり、その列にnull値を含む行はカウントされません。
CountryId を使用した例を次に示します。 前の例で述べた列:
SELECT COUNT(CountryId) AS 'Row Count' FROM Artists;
結果:
+-------------+ | Row Count | |-------------| | 0 | +-------------+
前の例で見たように、この列のすべての行は NULL
です。 。したがって、結果の行数はゼロになります。
その列にいくつかの値を追加しましょう:
UPDATE Artists SET CountryId = 2 WHERE ArtistName IN ( 'AC/DC', 'Karnivool', 'Birds of Tokyo', 'Bodyjar' );
次に、その列の行をもう一度数えましょう:
SELECT COUNT(CountryId) AS 'Row Count' FROM Artists;
結果:
+-------------+ | Row Count | |-------------| | 4 | +-------------+
例3–DISTINCTを使用
この例では、 DISTINCT
を使用しています 個別の行のみを返す句(つまり、重複しない行)。
前の例では、同じ
CountryId
になるようにテーブルを更新しました 4人のアーティストに適用されました( SET CountryId =2
を使用しました 4人のアーティスト全員)。これにより、同じ
CountryId
の4つの行が作成されました。 。
個別の CountryId の数を数えるとどうなりますか sはそのテーブルにあります:
SELECT COUNT(DISTINCT CountryId) 'Distinct CountryIds' FROM Artists;
結果:
+-----------------------+ | Distinct CountryIds | |-----------------------| | 1 | +-----------------------+
CountryId の行は4つありますが、これは予想されることです。 、それでも1つの異なる CountryId 。
念のため、「明確でない」バージョンと一緒に実行してみましょう。
SELECT COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct' FROM Artists;
結果:
+----------------+------------+ | Non Distinct | Distinct | |----------------+------------| | 4 | 1 | +----------------+------------+
したがって、明確でないバージョンは、
CountryId
の回数を示します DISTINCT
がテーブルに表示されますが、 versionは、複数回の出現を1としてカウントします。
別の CountryId を追加しましょう テーブルへ:
UPDATE Artists SET CountryId = 1 WHERE ArtistName = 'Carabao';
そして、クエリを再度実行します:
SELECT COUNT(CountryId) 'Non Distinct', COUNT(DISTINCT CountryId) 'Distinct' FROM Artists;
結果:
+----------------+------------+ | Non Distinct | Distinct | |----------------+------------| | 5 | 2 | +----------------+------------+
例4–WHERE句を使用する
WHERE
を使用した簡単な例を次に示します。 条項。
SELECT COUNT(*) AS 'Row Count' FROM Artists WHERE ActiveFrom >= '2000-01-01';
結果:
+-------------+ | Row Count | |-------------| | 2 | +-------------+
例5–GROUPBYを使用
これは、1つの列でアーティストをグループ化し、もう1つの列で各アーティストのすべてのアルバムをカウントする例です。
例:
SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums' FROM Artists ar INNER JOIN Albums al ON al.ArtistId = ar.ArtistId GROUP BY ArtistName ORDER BY 'Number of Albums' DESC;
結果:
+------------------------+--------------------+ | ArtistName | Number of Albums | |------------------------+--------------------| | Iron Maiden | 5 | | Michael Learns to Rock | 3 | | The Script | 3 | | Tom Jones | 3 | | Devin Townsend | 3 | | Allan Holdsworth | 2 | | Buddy Rich | 1 | | AC/DC | 1 | | Jim Reeves | 1 | +------------------------+--------------------+
例6–HAVING句を使用
前の例を微調整して、特定の数を超えるアルバムを持っているアーティストのみを含めることができます。 HAVING
を使用してこれを行うことができます 条項。
SELECT ArtistName, COUNT(al.AlbumId) 'Number of Albums' FROM Artists ar INNER JOIN Albums al ON al.ArtistId = ar.ArtistId GROUP BY ArtistName HAVING COUNT(al.AlbumId) > 2 ORDER BY 'Number of Albums' DESC;
結果:
+------------------------+--------------------+ | ArtistName | Number of Albums | |------------------------+--------------------| | Iron Maiden | 5 | | Michael Learns to Rock | 3 | | The Script | 3 | | Tom Jones | 3 | | Devin Townsend | 3 | +------------------------+--------------------+
例7–OVER句を使用したパーティション分割
OVER
を使用できます PARTITION BY
を含む句 結果をパーティションに分割します。
この例では、 OVER(PARTITION BY ArtistName)
を使用します アーティストが制作した各アルバムと、そのアーティストのアルバムの総数を一覧表示します。
SELECT ArtistName, AlbumName, COUNT(AlbumId) OVER (PARTITION BY ArtistName) 'Number of Albums from this Artist' FROM Artists ar INNER JOIN Albums al ON al.ArtistId = ar.ArtistId ORDER BY 'Number of Albums from this Artist' DESC;
結果:
+------------------------+--------------------------+-------------------------------------+ | ArtistName | AlbumName | Number of Albums from this Artist | |------------------------+--------------------------+-------------------------------------| | Iron Maiden | Powerslave | 5 | | Iron Maiden | Somewhere in Time | 5 | | Iron Maiden | Piece of Mind | 5 | | Iron Maiden | Killers | 5 | | Iron Maiden | No Prayer for the Dying | 5 | | AC/DC | Powerage | 3 | | AC/DC | Back in Black | 3 | | AC/DC | Rock or Bust | 3 | | Michael Learns to Rock | Blue Night | 3 | | Michael Learns to Rock | Eternity | 3 | | Michael Learns to Rock | Scandinavia | 3 | | Devin Townsend | Ziltoid the Omniscient | 3 | | Devin Townsend | Casualties of Cool | 3 | | Devin Townsend | Epicloud | 3 | | Tom Jones | Long Lost Suitcase | 3 | | Tom Jones | Praise and Blame | 3 | | Tom Jones | Along Came Jones | 3 | | Allan Holdsworth | All Night Wrong | 2 | | Allan Holdsworth | The Sixteen Men of Tain | 2 | | Buddy Rich | Big Swing Face | 1 | | Jim Reeves | Singing Down the Lane | 1 | | The Script | No Sound Without Silence | 1 | +------------------------+--------------------------+-------------------------------------+
これにより、アーティストとアルバムの数が複数の行で繰り返されることに注意してください。ただし、各アルバムをそれぞれの行にリストする場合にも、これが予想されます。
例8– STRING_AGG()を使用
前の例のように、各アーティストとアルバムの数を複数の行に繰り返したくない場合は、いつでも STRING_AGG()
を使用できます。 アルバムをリストとして出力する機能。この場合、 OVER
は必要ありません。 条項。
例:
SELECT ArtistName, STRING_AGG(AlbumName, ', ') 'Albums', COUNT(AlbumId) 'Count' FROM Artists ar INNER JOIN Albums al ON al.ArtistId = ar.ArtistId GROUP BY ArtistName ORDER BY 'Count' DESC;
結果:
+------------------------+--------------------------------------------------------------------------------+---------+ | ArtistName | Albums | Count | |------------------------+--------------------------------------------------------------------------------+---------| | Iron Maiden | Powerslave, Somewhere in Time, Piece of Mind, Killers, No Prayer for the Dying | 5 | | AC/DC | Powerage, Back in Black, Rock or Bust | 3 | | Michael Learns to Rock | Blue Night, Eternity, Scandinavia | 3 | | Devin Townsend | Ziltoid the Omniscient, Casualties of Cool, Epicloud | 3 | | Tom Jones | Long Lost Suitcase, Praise and Blame, Along Came Jones | 3 | | Allan Holdsworth | All Night Wrong, The Sixteen Men of Tain | 2 | | Buddy Rich | Big Swing Face | 1 | | Jim Reeves | Singing Down the Lane | 1 | | The Script | No Sound Without Silence | 1 | +------------------------+--------------------------------------------------------------------------------+---------+
たくさんの行?
COUNT()
関数はその結果をintとして返します データ・タイプ。行が多すぎて結果がintよりも大きい場合 処理できます。COUNT_BIG()
を試してください 代わりに。
COUNT_BIG()
COUNT()
と同じように機能します 、結果が bigintとして返されることを除いて データ型の値。
APPROX_COUNT_DISTINCT()
の使用を検討することもできます ある場合には。
APPROX_COUNT_DISTINCT()
正確な値ではなく、おおよその値を返します。ただし、 COUNT()
よりもはるかに応答性が高くなるように設計されています およびCOUNT_BIG()
、したがって、応答性が精度よりも重要である場合に役立つ可能性があります。
null以外の一意の値を返すように設計されているため、通常は DISTINCT
を使用する場合にのみ関連します。 COUNT_BIG()
を含む句 。
また、これを書いている時点では、 APPROX_COUNT_DISTINCT()
パブリックプレビューステータスです。