値が何種類あるか数える

 AccessにはCount関数やDCount関数がありますので、値がいくつあるのかを数えるのは簡単ですが、重複する値があるとき値が何種類あるのかを数えるのは結構面倒です。また、グループごとに種類を数えたいという場合もあります。データベースソフトによっては「SELECT (DISTINCT Count…)…」という構文が使えますがAccessでは使えませんので、以下ではサブクエリで対応する例を示します。

f:id:accs2014:20170521135451p:plain:right:w500

 例として右のようなテーブルがあります。
 「職業」列にさまざまな値が記録されていますが、記録されている職業は何種類あるでしょうか。
 また、「グループ」列のそれぞれの値(ぞうさんチーム、キリンさんチーム)ごとに見た場合、職業は何種類あるでしょうか。


f:id:accs2014:20170521132325p:plain:right:w300

 もっとも簡単なのは、別途クエリを作成して職業列をグループ化してみることです。
 右のようなクエリを作り、表示されるレコードの数を数えれば職業の種類がいくつあるか求まります(グループごとの職業の種類を求める場合はさらに「グループ」列を追加)。


f:id:accs2014:20170521135450p:plain:right:w600

 ただ、もともとクエリがあって、そこで値を直接求めたい場合は、サブクエリで求めることもできます。
 テーブル全体での職業の種類数、グループごとの職業の種類数は、それぞれ次のようになります。
 なお、Count関数の引数を「*」とすると、職業がNullの場合でも1種と数えられます。下記の例ではNullをカウントしません。

職業種類数: (SELECT Count([職業]) FROM (SELECT DISTINCT 職業 FROM 会員テーブル))
グループ別職業種類数: (SELECT Count([職業]) FROM (SELECT DISTINCT グループ,職業 FROM 会員テーブル AS 会員テーブル_1) WHERE 会員テーブル_1.グループ = 会員テーブル.グループ)



f:id:accs2014:20170521135449p:plain:right:w500

 データシートビューです。
 全体での職業は7種(戦士、僧侶、盗賊、魔法使い、ビショップ、侍、ロード)。
 ぞうさんチームの職業は5種(戦士、僧侶、盗賊、魔法使い、ビショップ)。
 キリンさんチームの職業は6種(僧侶、戦士、魔法使い、侍、ロード、盗賊)。
 いずれも正しい値が求められています。