mmm spot

好きで語ろうインターネッツ

Accessで重複削除カウントをグループ化するクエリをSQL文から操作するときのエラー

こんばんは、amumaです。タイトル長くてすみません。 元気ですか?私は元気にやっています。

さて先日、通っている大学の課題で「AccessSQL操作してデータベースをお勉強しましょう」みたいな課題があったんですが、このAccess、普通のSQL構文では動かないものが多い。SQLの課題のはずが、終いには途中からAccess独自の構文をいかにクリアするかの課題になってきていた(ぱそこんのキホン)。

ワイルドカードの問題など色々あったが、中でも特に迷った重複削除カウントをしたものをグループ化する時のSQL文をメモ程度に残しておく。 ちなみに使用バージョンは2016  

ここで、項目1はグループ化をしたい項目、項目2はカウントしたい項目を指す。 普通のSQL文ではこんな感じ↓

SELECT 項目1, COUNT(DISTINCT 項目2)
FROM テーブル
GROUP BY 項目1

しかしAccessでは、>COUNT(DISTINCT 項目2) の部分が定義されてないようで正しい演算子を書けと忠告してくる。

f:id:amuma5:20180509013359j:plain

というわけで書き直し。 色々調べると、DISTINCTを利用した重複削除カウントはAccessでは以下のように書くらしい。

SELECT COUNT(項目)
FROM (SELECT DISTINCT 項目)

では次にグループ化。

SELECT 項目1, COUNT(項目2)
FROM (SELECT DISTINCT 項目2 FROM テーブル)
GROUP BY 項目1

ここでエラーが出る。エラーというか、項目1に関しての検索ダイアログボックスがポップしてくる。 任意にポップアップさせることもできるらしいが、今回はそうではないので原因を考える。 試しにやってみると、重複削除カウントのみなら正常に動く。またダイアログボックスが表示されるのは、テーブルの参照が上手くいってない時にも起こるらしい。

というわけで?勘で以下のように書き換えてみた。

SELECT 項目名1, COUNT(項目名2)
FROM (SELECT DISTINCT 項目1, 項目2 FROM テーブル)
GROUP BY 項目1

なんかうまくいった。これでヨシとすることにした。 しかしこれだと項目1にもDISTINCTがかかっている気がする(勘)。なんかもっときれいにならないのか。それともAccessSQLで操作するものじゃないというのか。

以上。教授に文句言われたら言い返す。おやすみなさい。

--追記--
上のコードで大体正解だった。厳密には

SELECT 項目名1, COUNT(項目名2)
FROM (SELECT DISTINCT 項目2,項目1 FROM テーブル)
GROUP BY 項目1

の方が好ましいようだ。私の勘はあたってたっぽい。