グループ化された値のカウント
この例でのクエリは、GROUP BY を使用して、列の中で繰り返される値をグループ化し、その固有値 1 つごとに 1 行を返します。このクエリでは、続いて COUNT を使用して、別の列にある値のグループ別カウントを返します。
このクエリは、個別の FavoriteColors 値ごとに 1 行を返します。FavoriteColors が不要であるとすると、このクエリは、NULL 値の行があればそれを返します。各行には、以下の 2 つのカウントが関連付けられています。
SELECT
FavoriteColors,
COUNT(FavoriteColors) AS ColorPreference,
COUNT(Name) AS People
FROM Sample.Person
GROUP BY FavoriteColors
以下のクエリは、Sample.Person にある Home_State 値ごとに該当する人物の行数を返します。
SELECT
Home_State,
COUNT(*) AS AllPersons
FROM Sample.Person
GROUP BY Home_State
以下のクエリは、%AFTERHAVING を使用して、66 歳以上の人が 1 人以上いる各州の個人の行数と 66 歳以上の人数を返します。
SELECT
Home_State,
COUNT(Name) AS AllPersons,
COUNT(Name %AFTERHAVING) AS Seniors
FROM Sample.Person
GROUP BY Home_State
HAVING Age > 65
ORDER BY Home_State
このクエリは %FOREACH キーワードと %AFTERHAVING キーワードの両方を使用します。州ごとに 1 行を返すために GROUP BY を使用し、"A"、"M"、"W" のいずれかで始まる名前の人物のみを抽出するために HAVING を使用します。
SELECT
Home_State,
COUNT(Name) AS NameCount,
COUNT(Name %FOREACH(Home_State)) AS StateNameCount,
COUNT(Name %AFTERHAVING) AS NameCountHaving,
COUNT(Name %FOREACH(Home_State) %AFTERHAVING) AS StateNameCountHaving
FROM Sample.Person
GROUP BY Home_State
HAVING Name LIKE 'A%' OR Name LIKE 'M%' OR Name LIKE 'W%'
ORDER BY Home_State
各州の行には以下のカウント値があります。
-
COUNT(Name) — データベースに記録されているすべての人物。Name が必須であるとすると、このカウントは行の総数と同じです。
-
COUNT(Name %FOREACH(Home_State)) — 州のすべての人物。
-
COUNT(Name %AFTERHAVING) — データベースの中で HAVING の条件を満たすすべての人物。Name が必須であるとすると、この数は行の総数と同じです。
-
COUNT(Name %FOREACH(Home_State) %AFTERHAVING) — 州の中で HAVING の条件を満たすすべての人物。
ストリームにある列の値のカウント
COUNT(expression) を ストリーム列の値のカウントに使用できますが、多少の制約があります。
-
列のカウントには、重複値も含めて、NULL ではない値の総数が必ず算入されます。
-
COUNT DISTINCT expression 節でストリーム・フィールドを指定することはできません。これを実行しようとすると、SQLCODE -37 エラーが返されます。
-
%FOREACH column 節でストリーム・フィールドを指定することはできません。これを実行しようとすると、SQLCODE -37 エラーが返されます。
以下のクエリは、COUNT 関数の有効な使用法を示しています。Title は文字列フィールド、Notes と Picture はストリーム・フィールドです。
SELECT DISTINCT Title,COUNT(Notes),COUNT(Picture %FOREACH(Title))
FROM Sample.Employee
ストリーム・フィールドを指定したこれらのクエリは有効ではありません。
-- Invalid: DISTINCT keyword with stream field
SELECT Title,COUNT(DISTINCT Notes) FROM Sample.Employee
-- Invalid: %FOREACH col-list contains stream field
SELECT Title,COUNT(Notes %FOREACH(Picture))
FROM Sample.Employee
カウントで行が返されない
以下の各例では、COUNT でカウントする行が SELECT クエリで選択されない場合に COUNT が何を返すのかを示しています。クエリに応じて、COUNT は 0 または NULL を返します。
集約関数に対して指定する列を除き、FROM 節のテーブルにある列への参照が SELECT selectItem にない場合、COUNT は 0 を返します。
COUNT は 0 を返す唯一の集約関数です。他のすべての集約関数は NULL を返します。クエリは %ROWCOUNT 1 を返します。クエリのサンプルを以下に示します。
SELECT
COUNT(*) AS Recs, COUNT(Name) AS People,
AVG(Age) AS AvgAge, MAX(Age) AS MaxAge,
CURRENT_TIMESTAMP AS Now
FROM Sample.Employee
WHERE Name %STARTSWITH 'ZZZ'
SELECT selectItem に FROM 節のテーブルにある列への直接参照が記述されている場合、または TOP 0 が指定されている場合、COUNT は NULL を返します。クエリは %ROWCOUNT 0 を返します。クエリのサンプルを以下に示します。
SELECT
COUNT(*) AS Recs,
COUNT(Name) AS People,
$LENGTH(Name) AS NameLen
FROM Sample.Employee WHERE Name %STARTSWITH 'ZZZ'
テーブルを指定しない場合、COUNT(*) は 1 を返します。クエリは %ROWCOUNT 1 を返します。クエリのサンプルを以下に示します。
SELECT COUNT(*) AS Recs