三流君のHP [TOP] [VBA系] [ASP系] [コンビニ系] [愚痴系]

SQL Count関数を使ってみる SELECT Count(*) AS GCNT

下記、ASP で SQL文を発行したサンプルです、合わせて見て下さい。
SQL GROUP BY句 で グループ化 Count関数で集計する処理を解説する
SQL GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え
ADO から MDB へのアクセスでCount,Format関数使用
当日の時間帯別アクセス数を表示してみる SQLでCount,Format関数使用
-----
こんにちは。
今回は、読者からの質問への回答です。
*今後は、別のメルマガで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でした。。


質問や要望、クレームを送る(三流君に連絡する 連絡方法)

質問や要望など連絡方法でお互い確認が取りやすく、便利なのが掲示板なのですが、私の対応のまずさから不定期で荒れてしまい、掲示板は現在封鎖中です。(反省しなきゃ)
感想や質問・要望・苦情など 三流君へメッセージを送る。
時間的余裕のある要望・質問・苦情の場合は、下記のフォームからメッセージを送ることができます。
あなたのお名前(ニックネーム):さん
返信は?: 不用(HP更新を待つ) , E-mail→ アドレス:に返事をもらいたい

(感想や質問・要望・苦情はHPで記事に載せることがあります。)

急ぎで連絡がほしい、そんな時は:[三流君連絡先]に連絡してください。

番外編 愚痴系で書いてた今日の一品 (短いサブ関数など)

2000/05/13 SQL Count関数を使ってみる
2000/05/11 Access97 標準関数Midなどが使えない
2000/05/09 SendObjectのエンコード
2000/05/08 クエリーで〜以外とは
2000/04/27 Imagingコントロールを使ってみた
2000/04/25 Excel97 VBA イベントなど
2000/04/24 Access97で複数のプリンタを切替えて使用
2000/04/20 書式付きエクスポート DoCmd.OutputToで、できます
2000/04/19 Access97でExcel形式へExport時に書式設定を行いたい
2000/04/13 Access97でOutlook97/98とリンクする方法
2000/04/13 VBA Nameステートメント
2000/04/04 Accessでキー取得
2000/04/04 AccessでFile参照ダイアログ?
2000/04/03 縦書用数値変換改良
2000/04/01 Access Err テーブルを消したい
2000/03/31 縦書き数値、どうしてますか?
2000/03/29 VBA 手抜きで、処理後、explorerを開く
2000/03/28 Access --> Word へデータ
2000/03/24 名前一覧Excelの機能で、同じことできました
2000/03/23 Excel97 VBA セルに付けた名前一覧を作成する
2000/03/21 Excel セルに名前付け
2000/02/25 iniFileを読む GetPrivateProfileString
2000/02/15 Excel VBA Rangeオブジェクトとサンプル
2000/02/14 Access97 SizeMode/OLEサイズ で画像調整
2000/02/10 Access97 Pictureプロパティとサンプル
2000/02/09 Access97 集計クエリーで重複値をハジク
2000/02/07 Access97 サブフォームへ値をセット
2000/02/04 Access97 コントロールソース、チョットした使用法
2000/02/01 Access97 フォームフッター
2000/01/18 Access97 now()関数で有効期限処理、、、

←パソコンの技術系の書籍を探しているなら コンピュータ関連の出版社33社(アスキー、インプレス等)が共同運営するコンピュータの本・専門店 種類が豊富で探し易い※在庫ありが48時間以内発送


[三流君(TOP)]へ戻る。