たま氏の覚え書き

KNIME・AccessVBA・Swift等、学習したことを覚え書き

AccessVBA_SQLによるレコードの重複の削除・データのグループ化【GROUPBY】【DISTINCT】【HAVING】

SQLを使って指定したテーブルのデータのグループ化を行う

【DISTINCT】による重複の削除

内容が重複しているレコードを削除する

記述

書式:
SELECT DISTINCT ALL フィールド名 FROM テーブル名

▼DISTINCTのいろいろな記述方法▼
【SQL入門】DISTINCTで重複行をまとめる方法をわかりやすく解説 | 侍エンジニアブログ

【GROUPBY】による重複の削除

留意点

全てのフィールドを選択してグループ化 = 重複レコードの削除 = Distinctと同じ
複数のフィールドを指定してグループ化を行う場合には、左に位置するフィールドを優先してグループ化される

集計関数の使用

統計情報を取得する場合にはSQL集計関数を使用する
 Count(フィールド名)_引数に指定したフィールドのNull値以外のレコード件数を返す
  ※「*」を引数に指定するとNull値も含めた件数が返る
 Avg(フィールド名)_引数に指定したフィールドの平均値を返す
 Sum(フィールド名)_引数に指定したフィールドの合計値を返す
 Min(フィールド名)_引数に指定したフィールドの最小値を返す
 Max(フィールド名)_引数に指定したフィールドの最大値を返す

記述

書式:
統計関数を使わない場合
SELECT フィールド名 FROM テーブル名 GROUPBY フィールド名A ,フィールド名B, ・・・・

統計関数を使う場合
SELECT 集計関数(フィールド名) AS 別フィールド名A, 集計関数(フィールド名) AS 別フィールド名B FROM テーブル名 GROUPBY フィールド名A ,フィールド名B, ・・・・

【HAVING】抽出条件の設定

さらに特定のパターンを持つ特定のレコードの抽出をしたい場合にはHAVING句を使用する
HAVING句は、グループ化した後のレコードに対して条件を指定し、WHERE句と異なりSQL集計関数を使用することが可能
書式:
SELECT * FROM テーブル名 GROUPBY フィールドA, フィールドB HAVING 集計関数(フィールドB) > 10

【実践】

指定のレコードを除外したうえで、Count関数で指定フィールドの件数を出し
かつ、結果として出した件数が0ではないものを抽出

▼記述例▼

SubSearch_test()
 Dim SearchSQL  As String
 SearchSQL = "SELECT Count(整理番号) As 件数 , 郵便番号 , 都道府県 " & _
 "FROM テーブルA " & _
 "WHERE 郵便番号 <> '200-0000' " & _
 "GROUPBY 郵便番号" & _
 "HAVING Count(件数) <> 0 ;" 

 CurrentDb.QueryDefs("POSTCODEクエリ").SQL = SearchSQL 'クエリ名をセット
 DoCmd.OpenQuery"POSTCODEクエリ" '実行
End Sub