COUNT¶
指定した列のNULL 以外のレコードの数、またはレコードの合計数を返します。
構文¶
集計関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] )
COUNT(*)
COUNT(<alias>.*)
ウィンドウ関数
COUNT( [ DISTINCT ] <expr1> [ , <expr2> ... ] ) OVER (
                                                     [ PARTITION BY <expr3> ]
                                                     [ ORDER BY <expr4> [ ASC | DESC ] [ <window_frame> ] ]
                                                     )
window_frame の構文の詳細については、 ウィンドウ関数の構文と使用法 をご参照ください。
引数¶
- expr1
- 列名。修飾名にもできます(例: database.schema.table.column_name)。 
- expr2
- 必要に応じて、追加の列名を含めることができます。例えば、姓と名の異なる組み合わせの数をカウントできます。 
- expr3
- 結果を複数のウィンドウに分割する場合、パーティション化する列です。 
- expr4
- 各ウィンドウを並べ替える列です。これは、最終結果セットを順序付けるための ORDER BY 句とは別のものです。 
- *
- 記録の総数を返します。 - 関数にワイルドカードを渡す場合、ワイルドカードをテーブルの名前またはエイリアスで修飾することができます。例えば、 - mytableというテーブルからすべての列を渡すには、以下のように指定します。- (mytable.*) - ILIKE と EXCLUDE キーワードを使ってフィルタリングすることもできます。 - ILIKE は、指定されたパターンに一致する列名でフィルターします。許されるパターンは1つのみです。例: - (* ILIKE 'col1%') 
- EXCLUDE は、指定された列に一致しない列名をフィルターします。例: - (* EXCLUDE col1) (* EXCLUDE (col1, col2)) 
 - 修飾子は、これらのキーワードを使用する場合に有効です。以下の例では、 ILIKE キーワードを使用して、テーブル - mytable内のパターン- col1%に一致するすべての列をフィルターします。- (mytable.* ILIKE 'col1%') - ILIKE と EXCLUDE キーワードは、1つの関数呼び出し内で組み合わせることはできません。 - 修飾もフィルターもされていないワイルドカード( - *)を指定した場合、この関数は NULL の値を持つ記録を含む記録の総数を返します。- フィルターに ILIKE または EXCLUDE キーワードでワイルドカードを指定した場合、この関数は NULL 値を持つ記録を除外します。 - この関数では、 ILIKE と EXCLUDE キーワードは SELECT リストまたは GROUP BY 句でのみ有効です。 - ILIKE と EXCLUDE キーワードの詳細については、 SELECT の「パラメータ」セクションをご参照ください。 
- alias.*
- NULL 値を含まない記録の数を返します。例については、 例 をご参照ください。 
戻り値¶
NUMBER 型の値を返します。
使用上の注意¶
- この関数は、 JSON null (VARIANT NULL)を SQL NULL として扱います。 
- NULL 値と集計関数の詳細については、 集計関数と NULL 値 をご参照ください。 
- この関数が集計関数として呼び出される場合、 - DISTINCTキーワードを使用すると、すべての列に適用されます。例えば、- DISTINCT col1, col2, col3は、列- col1、- col2、および- col3のさまざまな組み合わせの数を返すことを意味します。例えば、次のデータを想定します。- 1, 1, 1 1, 1, 1 1, 1, 1 1, 1, 2 - この場合、関数は - 2を返します。これは、3つの列の値の個別の異なる組み合わせの数です。
 
- この関数が、 ORDER BY 句を含む OVER 句を持つウィンドウ関数として呼び出される場合: - ウィンドウフレームが必要です。ウィンドウフレームが明示的に指定されていない場合、次のような暗黙のウィンドウフレームが使用されます。 - RANGE BETWEEN UNBOUNDED PRECEDING AND CURRENT ROW- 構文、使用上の注意、例を含むウィンドウフレームの詳細については、 ウィンドウ関数の構文と使用法 をご参照ください。 
- ウィンドウ関数内でキーワード DISTINCT を使用することは禁止されており、コンパイル時間エラーが発生します。 
 
- 条件に一致する行の数を返すには、 COUNT_IF を使用します。 
- 可能であれば、 行アクセスポリシー なしでテーブルとビューに COUNT 関数を使用します。この関数を使用したクエリは、行アクセスポリシーのないテーブルまたはビューでより高速かつ正確になります。パフォーマンスの違いの理由は次のとおりです。 - Snowflakeはテーブルとビューの統計を維持し、この最適化により単純なクエリをより高速に実行できます。 
- テーブルまたはビューに行アクセスポリシーが設定されていて、クエリで COUNT 関数が使用されている場合、Snowflakeは各行をスキャンして、ユーザーがその行を表示できるかどうかを判断する必要があります。 
 
例¶
以下の例では、 NULL 値を含むデータに対して COUNT 関数を使用しています。
テーブルを作成して値を挿入します。
CREATE TABLE basic_example (i_col INTEGER, j_col INTEGER);
INSERT INTO basic_example VALUES
    (11,101), (11,102), (11,NULL), (12,101), (NULL,101), (NULL,102);
テーブルをクエリします。
SELECT *
    FROM basic_example
    ORDER BY i_col;
+-------+-------+
| I_COL | J_COL |
|-------+-------|
|    11 |   101 |
|    11 |   102 |
|    11 |  NULL |
|    12 |   101 |
|  NULL |   101 |
|  NULL |   102 |
+-------+-------+
SELECT COUNT(*) AS "All",
       COUNT(* ILIKE 'i_c%') AS "ILIKE",
       COUNT(* EXCLUDE i_col) AS "EXCLUDE",
       COUNT(i_col) AS "i_col", 
       COUNT(DISTINCT i_col) AS "DISTINCT i_col", 
       COUNT(j_col) AS "j_col", 
       COUNT(DISTINCT j_col) AS "DISTINCT j_col"
  FROM basic_example;
+-----+-------+---------+-------+----------------+-------+----------------+
| All | ILIKE | EXCLUDE | i_col | DISTINCT i_col | j_col | DISTINCT j_col |
|-----+-------+---------+-------+----------------+-------+----------------|
|   6 |     4 |       5 |     4 |              2 |     5 |              2 |
+-----+-------+---------+-------+----------------+-------+----------------+
この出力の All 列は、 COUNT に修飾もフィルターもされていないワイルドカードが指定された場合、関数は NULL 値を持つ行を含むテーブル内の行の総数を返すことを示しています。出力の他の列は、列またはフィルター付きワイルドカードが指定された場合、関数は NULL 値を含む行を除外することを示しています。
次のクエリでは、 COUNT 関数を GROUP BY 句とともに使用しています。
SELECT i_col, COUNT(*), COUNT(j_col)
    FROM basic_example
    GROUP BY i_col
    ORDER BY i_col;
+-------+----------+--------------+
| I_COL | COUNT(*) | COUNT(J_COL) |
|-------+----------+--------------|
|    11 |        3 |            2 |
|    12 |        1 |            1 |
|  NULL |        2 |            2 |
+-------+----------+--------------+
次の例は、 COUNT(alias.*) が NULL 値を含まない行の数を返すことを示しています。 basic_example テーブルには合計6行ありますが、3行には少なくとも1つの NULL 値があり、残りの3行には NULL 値がありません。
SELECT COUNT(n.*) FROM basic_example AS n;
+------------+
| COUNT(N.*) |
|------------|
|          3 |
+------------+
次の例は、 JSON null (VARIANT NULL)が COUNT 関数によって SQL NULL として扱われることを示しています。
テーブルを作成し、 SQL NULL 値と JSON null値の両方を含むデータを挿入します。
CREATE OR REPLACE TABLE count_example_with_variant_column (
  i_col INTEGER, 
  j_col INTEGER, 
  v VARIANT);
BEGIN WORK;
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  VALUES (NULL, 10, NULL);
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 1, 11, PARSE_JSON('{"Title": null}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 2, 12, PARSE_JSON('{"Title": "O"}');
INSERT INTO count_example_with_variant_column (i_col, j_col, v) 
  SELECT 3, 12, PARSE_JSON('{"Title": "I"}');
COMMIT WORK;
この SQL コードでは、次に注意してください。
- 最初の INSERT INTO ステートメントは、 VARIANT 列と VARIANT 以外の列の両方に SQL NULL を挿入します。 
- 2番目の INSERT INTO ステートメントは、 JSON null(VARIANT NULL)を挿入します。 
- 最後の2つの INSERT INTO ステートメントは、 NULL VARIANT 以外の値を挿入します。 
データを表示します。
SELECT i_col, j_col, v, v:Title
    FROM count_example_with_variant_column
    ORDER BY i_col;
+-------+-------+-----------------+---------+
| I_COL | J_COL | V               | V:TITLE |
|-------+-------+-----------------+---------|
|     1 |    11 | {               | null    |
|       |       |   "Title": null |         |
|       |       | }               |         |
|     2 |    12 | {               | "O"     |
|       |       |   "Title": "O"  |         |
|       |       | }               |         |
|     3 |    12 | {               | "I"     |
|       |       |   "Title": "I"  |         |
|       |       | }               |         |
|  NULL |    10 | NULL            | NULL    |
+-------+-------+-----------------+---------+
COUNT 関数が、 NULL と JSON null(VARIANT NULL)の値の両方を NULLs として扱うことを示しています。テーブルには4つの行があります。1つには SQL NULL があり、もう1つには JSON nullがあります。これらの行は両方ともカウントから除外されるため、カウントは 2 になります。
SELECT COUNT(v:Title)
    FROM count_example_with_variant_column;
+----------------+
| COUNT(V:TITLE) |
|----------------|
|              2 |
+----------------+