<MDBへのSQL文 Format関数使用>
こんにちは、三流プログラマーのKen3です。 今回は、SQL文の中で関数を使ってみます。 *少しハマりました。笑ってください。。。 何かの参考となれば幸いです。/* * 1.日付別にデータをカウントしたくて */
前回まで、GROUP BYで、グループ化して、データを集計してました。 http://www.ken3.org/cgi-bin/test/test039-1.asp で、 Select URL, Count(URL) As URLCNT From log GROUP BY URL ORDER BY Count(URL) DESC とSQL文を発行して、訪問者のURL単位の集計をとりました。 日付別のアクセス数をカウントしたくて、少し悩みました。 悩みの理由は、テーブルの構造が、 cnt.mdb テーブル名:log IP URL referrer WriteTime と項目があって、WriteTimeに2003/03/23 13:20:23と時刻まで入ってます。 そのままグループ化できないしなぁ、、、/* * 2.ADO から MDB へのアクセス(SQL文)でFormat関数使用 */
なんて、深く考えていたのですが、 SQL文の中でFormat関数が使えるみたいなので、使ってみました。 えっ、過去のメルマガで、VBScriptでは使えないって言ってたよね? In message "[ASPで遊ぶ No.019] - 001行目と表示したくてRight関数を使う", >/* > * 2.あれ?Format関数って使えないの? >*/
> >VBAも少し知ってる私は、 >有名なFormat関数を使用して、 >Format(カウンター,"000") >にすればOKだと思い軽く修正しました。 > >Do While ts.AtEndOfStream = False '*6ファイルの終端になってない間ループ > strDATA = ts.ReadLine 'ファイルからデータを一行を読む > nLINE = nline + 1 '行カウンタを+1する > Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示 > Response.Write strDATA '読み込んだデータを表示 > Response.Write "<BR>" '改行のタグを入れる > '行カウンタが5、10、15、、5で/って余りが0なら > '<HR>タグを挿入する > If nLINE Mod 5 = 0 Then > Response.Write "<HR>" 'タグを入れる > End If >Loop > >の表示部分を、 > Response.Write Format(nLINE,"000") & "行目 " '*1行番号の表示 >に変えました、余裕でしょ。 > >あれ? > >エラー タイプ >Microsoft VBScript 実行時エラー (0x800A000D) >型が一致しません。: 'Format' >/test/test019-1.asp, line 26 > >ウソでしょ?エラーだよ。 >なんで? > >何でジャねぇダロ三流君、 >ASP(VBScript)に、 >Format関数は無いんだよ。存在しないの。 > >またまたぁ。 >と >思い、少し調べてみると、やはり無いみたい。 --- と解説してたのに? あっ、VBScriptでは無いんだけど、MDBへのSQL文では使えるみたいです。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ 下記のようなSQLを作りました。 strSQL = "Select Format(WriteTime, 'YYYYMMDD') AS YYYYMMDD, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " GROUP BY Format(WriteTime, 'YYYYMMDD')" 普通にFormat(WriteTime, 'YYYYMMDD')と使ってます。 http://www.ken3.org/cgi-bin/test/test040-1.asp でテスト可能です。 <%@LANGUAGE=VBScript%> <html> <head> <title>ADO から MDB へのアクセスでFormat関数使用</title> </head> <body> <h2>ADO から MDB へのアクセスでFormat関数使用</h2> test040-1.asp<br> <hr> <b>YYYYMMDDでデータをまとめて集計表示します。</b><br> <font color="red">GROUP BY Format(WriteTime, 'YYYYMMDD')でまとめてみた。</font><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 'FORMAT関数を使用して、テーブル名logからデータを集計する 'SQL文を発行する strSQL = "Select Format(WriteTime, 'YYYYMMDD') AS YYYYMMDD, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " GROUP BY Format(WriteTime, 'YYYYMMDD')" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>NO.</TD>" Response.Write "<TD>日付</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>" & rs.Fields.Item("YYYYMMDD") & "</TD>" Response.Write "<TD ALIGN='RIGHT'>" & rs.Fields.Item("CNT") & "</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> </body> </html> http://www.ken3.org/cgi-bin/test/test040-1.asp の出力結果は、 NO. 日付 閲覧ページ数 1 20030316 384 2 20030317 1528 3 20030318 1555 4 20030319 1621 5 20030320 1484 6 20030321 609 7 20030322 516 8 20030323 173 みたいな感じで集計・表示してます。 なんだぁ、Format関数使えるのかぁ、、、って感じですね。/* * 3.当日の時間帯別アクセス数を表示してみる */
あまり意味のない集計なのですが、 当日の時間帯別のアクセス数を表示してみます。 発行するSQL文は、 ~~~~~~~~~~~~~~~~~~ Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT From log Where WriteTime >= #2003/03/23# GROUP BY Format(WriteTime, 'HH') で、 strSQL = "Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " Where WriteTime >= #" & Date & "#" '当日を条件に strSQL = strSQL & " GROUP BY Format(WriteTime, 'HH')" で作成しました。 ポイントは、 Format(WriteTime, 'HH')で時間の取りだし と " Where WriteTime >= #" & Date & "#"の当日指定の部分かなぁ。 http://www.ken3.org/cgi-bin/test/test040-2.asp でテスト可能です。(あんまり訪問者居ないなぁ(笑)) <%@LANGUAGE=VBScript%> <html> <head> <title>当日の時間帯別アクセス数を表示してみる SQLでFormat関数使用</title> </head> <body> <h2>当日の時間帯別アクセス数を表示してみる SQLでFormat関数使用</h2> test040-2.asp<br> <hr> <b>当日の時間帯別アクセス数を表示してみる</b><br> <font color="red">GROUP BY Format(WriteTime, 'HH')でまとめてみた。</font><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 'FORMAT関数を使用して、テーブル名logからデータを時間帯別に集計する 'SQL文を発行する strSQL = "Select Format(WriteTime, 'HH') AS HH, Count(*) AS CNT" strSQL = strSQL & " From log" strSQL = strSQL & " Where WriteTime >= #" & Date & "#" '当日を条件に strSQL = strSQL & " GROUP BY Format(WriteTime, 'HH')" 'オマケで画面にデータ表示 Response.Write "<hr>発行する(した)SQL文は<br><B><font color='green'>" Response.Write strSQL & "</font></B><br>です<hr>" Set rs = db.Execute(strSQL) 'データの表示をテーブルで行う Response.Write Date & "の時間帯別のアクセス集計<br>" Response.Write "<TABLE Border='1'>" '見出しをバカっぽく、そのまま書き込む Response.Write "<TR>" Response.Write "<TD>時間帯</TD>" Response.Write "<TD>閲覧ページ数</TD>" Response.Write "</TR>" 'EOFまでループ Do While rs.EOF = False '.EOFがFalseの間 Response.Write "<TR>" '内容を表示する Response.Write "<TD>" & rs.Fields.Item("HH") & "時〜</TD>" Response.Write "<TD ALIGN='RIGHT'>" & rs.Fields.Item("CNT") & "</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> </body> </html> http://www.ken3.org/cgi-bin/test/test040-2.asp の実行結果 2003/03/23の時間帯別のアクセス集計 時間帯 閲覧ページ数 00時〜 27 01時〜 14 ・ ・ ・ 12時〜 13 13時〜 28 みたいな感じで表示されます。/* * 4.終わりの挨拶 */
SQL文でいろいろと処理ができます。 ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ いろいろな切り口から、集計してみたいと思います。 今日、少し驚いたのは、MDBへのSQL文でFormat関数が使えたことでした。 素朴な疑問あったら、気軽に、 メール、掲示板に書き込んでくださいね。 掲示板 : http://www.ken3.org/asp/bbs-asp.html ASP、VBScript勉強中の三流プログラマーのKen3でした。 ---------------------------------- 関連項目(ただのバックナンバー紹介) ---------------------------------- [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(項目名)で集計しました。
ここまで、読んでいただきどうもです。目的の情報が見つかったか?少々心配しつつ、、、
感想や質問・要望・苦情など 三流君へメッセージを送る。
下記のフォームからメッセージを送ることができます。
[三流君(TOP ken3.org へ戻る)]
/ [ASPで遊ぶ、失敗する]
/ [ASP記事 バックナンバー目次]
まぁ、基本はデータの受け取りかなぁ。
・[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記事 バックナンバー目次]