[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.039 SQL GROUP BY句 で グループ化 集計結果を並べ替えする

SQL GROUP BY句 で グループ化 集計結果を並べ替えする



本文(発行内容)


<SQL GROUP BY句 で グループ化 集計結果を並べ替えする>
こんにちは、三流プログラマーのKen3です。

前回、グループ化して集計を取りました。
今回は、その集計結果で並べ替えをします。
*少しハマりました。笑ってください。。。

何かの参考となれば幸いです。

/* * 1.SQLがうまく作成できずにハマる(笑) */

前回の、[No.38 SQL GROUP BY句 で グループ化する] ( http://www.ken3.org/backno/backno_asp08.html#38 を参照) で、 cnt.mdb (Access DB) テーブル名:log IP URL referrer WriteTime からURLでグループ化して、訪問者数をカウントしました。 SQL GROUP BY句 で グループ化 Count(項目名)でレコード数を集計する http://www.ken3.org/cgi-bin/test/test038-2.asp 無事、URL単位でデータが集計されました。 No. URL 訪問者 1 http://www.ken3.org 2人 2 http://www.ken3.org/ 148人 3 http://www.ken3.org/24h/add24h.html 13人 4 http://www.ken3.org/asp/add-asp.html 46人  ・  ・ 230 http://www.ken3.org/vba/excel-help.html 32人 231 http://www.ken3.org/vba/iwind.html 28人 232 http://www.ken3.org/vba/object.html 96人 とURLの順に表示されました。 これを訪問者の多い順に並べ直したいと思い、 並べ替えだろ、そんなのORDER BYでOKだから、 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY URLCNT DESC" と、 ORDER BY URLCNT DESC Count(URL) As URLCNTで作成した項目を使いました。 あれ?動作しない、、、なぜだろう、、、 ~~~~~~~~~~~~~~~~~~~~~ いろいろとやるが思うように進まなかった。

/* * 2.集計関数をそのまま書くとOKです。 */

答えはかんたんでした。 ~~~~~~~~~~~~~~~~~~~~~ strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" と、 ORDER BY Count(URL) DESC を指定したら動作しました。 ~~~~~~~~~~~~~~~~~~~~~~~~ う〜ん、、まぁいっか。 http://www.ken3.org/cgi-bin/test/test039-1.asp でテストできます。 <%@LANGUAGE=VBScript%> <html> <head> <title>GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え</title> </head> <body> <h2>GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え</h2> test039-1.asp<br> <hr> <b>cnt.mdb から訪問されたURLをグループ化して集計、降順に表示</b><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'お約束のレコードセットの作成 テーブル名URLを指定 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> <A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br> <br> </body> </html>

/* * 3.Date関数の値を使用して、当日分をグループ化集計 */

さてと、全体から訪問者の多い順に表示することができました。 次は、当日に来た来場者の数を表示してみたいと思います。 Date関数で現在の日付を取出して、それを条件にしてみたいと思います。 strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "WHERE WriteTime >= #" & Date & "# " '日付は#で囲う strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" 現在のシステム日付をDate関数で受け取り、 SQL文のWhere句で指定します。 ポイントは、日付型なので##で囲むことです。 http://www.ken3.org/cgi-bin/test/test039-2.asp でテストできます、確認して見て下さい。*ページの人気も含めて(笑) <%@LANGUAGE=VBScript%> <html> <head> <title>Date関数の値を使用して、当日分をグループ化集計</title> </head> <body> <h2>Date関数の値を使用して、当日分をグループ化集計</h2> test039-2.asp<br> <hr> <b>cnt.mdb から訪問されたURLをグループ化して集計、降順に表示</b><br> <hr> <% 'ADO DB Connection オブジェクトを作成する、英文そのままじゃん Set db=Server.CreateObject("ADODB.Connection") '.Provider?プロバイダー?通信会社?じゃなくって 'データアクセスにはJet.OLEDB.4.0を使うことを設定 db.Provider = "Microsoft.Jet.OLEDB.4.0" '次に、接続DBの位置を渡すので、Server.MapPathで変換して渡す db.ConnectionString = Server.MapPath("cnt.mdb") 'やっとデータベースを開ける db.open 'お約束のレコードセットの作成 テーブル名URLを指定 'GROUP BY句 で グループ化 Count関数で集計 ORDER BY句で並べ替え strSQL = "Select URL, Count(URL) As URLCNT " strSQL = strSQL & "From log " strSQL = strSQL & "WHERE WriteTime >= #" & Date & "# " '日付は#で囲う strSQL = strSQL & "GROUP BY URL " strSQL = strSQL & "ORDER BY Count(URL) DESC" Set rs = db.Execute(strSQL) Response.Write "発行したSQL文は[<b>" & strSQL & "</b>]です。<br><br>" 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>No.</TD>" Response.Write "<TD>URL</TD>" Response.Write "<TD>訪問者</TD>" Response.Write "</TR>" 'EOFまでループ nCNT = 1 Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & nCNT & "</TD>" Response.Write "<TD><A HREF='" & rs.Fields.Item("URL") & "' Target='_blank'>" Response.Write rs.Fields.Item("URL") & "</A></TD>" Response.Write "<TD ALIGN=RIGHT>" & rs.Fields.Item("URLCNT") & "人</TD>" Response.Write "</TR>" & Chr(13) & Chr(10) '次のレコードにポインタを移動する rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop Response.Write "</TABLE>" 'テーブルは終わりです '開いていたレコードセットを閉じる rs.Close 'データベースも閉じようよ db.Close 'お行儀よくオブジェクトも開放しましょう(通常は自動的に解放されるけど) Set db = Nothing %> <hr> 終了です。<br> <A HREF="test037-1.asp">cnt.mdb 最近訪問した人のデータ30件を表示</A><br> <br> </body> </html>

/* * 4.終わりの挨拶 */

SQL文でいろいろと処理ができます。 いろいろな切り口から、集計してみたいと思います。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [No.27 SQL INSERT INTO文でデータの追加] ( http://www.ken3.org/backno/backno_asp06.html#27 を参照) では、 SQLのINSERT INTO文を使って、データをDBに追加。 [No.28 SQL ORDER BYでデータの並べ替え] ( http://www.ken3.org/backno/backno_asp06.html#28 を参照) では、 SQLのORDER BYを使ってデータの並べ替え、 DESCを追加して降順(逆順)を解説。 [No.37 訪問者のログをMDBで管理] ( http://www.ken3.org/backno/backno_asp08.html#37 を参照) では、 IPアドレスURLをAccess MDBへ保存しました。 [No.38 SQL GROUP BY句 で グループ化する] ( http://www.ken3.org/backno/backno_asp08.html#38 を参照) では、 URLでグループ化して、集計関数Count(項目名)で集計しました。


ページフッター

ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、

三流君へ メッセージを送る

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 XXXXさんへ
下記のフォームからメッセージを送ることができます。


あなたのお名前(ニックネーム):さん
返信は?:

アドレス:に返事をもらいたい
感想や質問↓:


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

種類別のリンク や 広告など

[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


Blogとリンク:[三流君のMemo別館]/ [ASP 三流君のソースコード置き場]/ [Ken3Video YouTubeで動画解説]
広告:

気になった ジャンル ↓を選択してください。

まぁ、基本はデータの受け取りかなぁ。
・[Form等を使用したデータのやり取り]・・・ASPと言っても、HTMLの入力フォームからデータを受け取ります。POSTやGETでやりとりを押さえますか。

次は、データの入出力 で ADOを使った(ADOで接続) と SQLの解説を少々
・[ADOでMdbファイルを使う]・・・MDBと接続して、簡単な追加・更新・削除を行った。
・[ADOでExcelと接続してみた]・・・.xlsと接続してSQLを使ってみた。
・[ADOでCSVと接続してみた]・・・.CSV テキストを読み出した。※更新・削除はできません

広告:



DBが使えるので、あまり使用しないけど、普通のテキストファイル処理
・[テキストファイル処理]・・・ファイルを開いて、書き込む。1行読み込みなどを軽く

VBScriptでFormat関数が無いなど、微妙にVBAと違うけど
[VBScript関数関係の説明]・・・少し、処理を書いてみた。
[その他処理サンプル]・・・あまり良いサンプル作れなかったけど。。。
何かの参考となれば幸いです。



[三流君(TOP ken3.org へ戻る)] / [ASPで遊ぶ、失敗する] / [ASP記事 バックナンバー目次]


広告: