こんにちは。
今回は、読者からの質問への回答です。
*今後は、別のメルマガでVBA関係やっていきます。
えっ、始めから期待して無いって?そんなこと言わないで、、、
まず、質問内容(対応が遅かったから、解決していると思うが、、)
In message "Fwd: 質問(SELECT文について)",
>SELECT文で重複行を表示しないのは
>DISTINCTで できなすが
>逆に重複している行だけをSQLだけで
>表示できますか?
>全部のデータを読んでコントロールブレイクを
>取りながら重複行を検索するしかないんですか?
'----------------------------------------------
SQLのCount関数を使用して、やってみたいと思います。
まず、下記のようなデータがあるとします
テーブル名 : DATA
ID CODE
1 A
2 A
3 A
4 BB
5 CCC
6 CCC
7 DDDD
8 DDDD
9 EEEEE
10 FFFFFF
11 FFFFFF
12 FFFFFF
13 GGGGGG
14 HHHHHHH
A,CCC,DDDD,FFFFFFを抜き出して、処理したいんだけど、、、
さて、どうしましょう?
グループ分けをして、レコード数を数えるSQLを
普通にクエリーのデザイン画面で作ります。
*ポイントは、表示メニューの集計をチェックしておくことです。
次に、SQLビューに切替え、作成したSQLをみます。
SELECT DATA.CODE, Count(DATA.CODE) AS GCNT
>FROM DATA
GROUP BY DATA.CODE;
なんて、SQLを自動的に書いてくれます。
これを元に、下記のモジュールで確認しました。
Sub test01()
Dim DB As Database
Dim TB As Recordset
Dim nCNT As Integer
Dim strSQL As String
'カレントデータベースを参照
Set DB = CurrentDb
'SQL文作成、、レコードセットを開く
strSQL = "SELECT DATA.CODE, Count(DATA.CODE) AS GCNT FROM DATA GROUP BY DATA.CODE;"
Set TB = DB.OpenRecordset(strSQL)
If TB.RecordCount = 0 Then
MsgBox "データ無し"
Else
TB.MoveFirst
'データが無くなるまで
While TB.EOF = False
MsgBox TB![code] & " = " & TB![GCNT] & "件"
TB.MoveNext
Wend
End If
TB.Close
DB.Close
End Sub
おいおい、、、これだと、1件のデータも表示するぞ?
できてないじゃん、、、
まぁまぁ、ハヤマラナイデね。。。
アレンジでif TB![GCNT] <> 1 then みたいにするとか、
入れてくださいよ。。。
なんて書くと、クレームきますね。
クエリーのデザイン画面で、Not 1
を入れると、下記のSQL文が自動作成されます。
SELECT DATA.CODE, Count(DATA.CODE) AS GCNT
>FROM DATA
GROUP BY DATA.CODE
HAVING ((Not (Count(DATA.CODE))=1));
このSQL文をレコードセットのソースにすれば、
1件以上重複のあるデータ(レコード数が1以上)を取り出せます。
*Count(DATA.CODE)>1 のほうがいいかな?
GROUP BYは知ってたけど、
HAVINGは知らなかった、、、
いつのまにか、SQLを書けないプログラマーになってた、、、
と自分でも気がついたとこで、
今回のまとめ・ポイントは、
SQLでCount関数を使用するのと、
HAVING 句を使用して、グループ化されたデータをしぼる?です。
ヘルプを見ながら、SQLの奥深さを味わってください。
*無知なKen3への辛口ご意見・助言募集です。
辛口ご意見の例
・なっちゃいないなぁ、、、Where句とHAVING句の違いを書かなきゃ
・集合関数Sum(項目)やMax(項目)なども合わせて説明したら?
・オマエ三流たからコントロールブレークって意味知らないだろ?
などなど、、
では。。。また。。。
頼りにならないなぁもう、、三流プログラマーのKen3でした。。
質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
|
感想や質問・要望・苦情など 三流君へメッセージを送る。 時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。 |
| ←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 ※種類が豊富で探し易い※在庫ありが48時間以内発送 |