[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.083 Select TOP 20 と Select Top n PERCENT で遊ぶ

Select TOP 20 と Select Top n PERCENT で遊ぶ



本文(発行内容)


<Select TOP 20 と Select Top n PERCENT で遊ぶ>

こんにちは、三流プログラマーのKen3です。 前回、 データが100件あって、20行単位で画面にデータを表示したい、 そんなよく見かけるページ処理に挑戦してみました。 今回は、その続きをグダグタと・・・

/* * 1.今回のキッカケ */

掲示板で下記の質問をもらいました ------ 質問2:検索キーワードから表示したデータの改ページ処理機能     (検索結果が30件あったら、とりあえず20件まで      表示させ”次ページ”ボタン等で残り結果を表示させる      ように・・・) ------ と、 ページ単位の表示について、質問をもらいました。 に対して、 ページ番号を受け取り、 Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC") 'データの頭だし 芸無く空読みする nCNT = 1 'EOFまでループ or データが(nPAGE-1)*20まで空読み Do While rs.EOF = False And nCNT <= (nPAGE-1) * 20 '.EOFがFalseで件数以下 '次のレコードにポインタを移動する(何もしてないのに・・・(笑)) rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop なんて、やってました。 http://www.ken3.org/cgi-bin/test/test082-1.asp?page=7 と、指定ページに飛べることは、飛べるけど・・・ SQL Select文をいろいろと探っていたら、 今回の件とはあまり関係無いけど、 ^^^^^^^^^^^^^^^^^^^^^^^^^^ Select TOP 20 とか Select 20 〜 なんて項目を見つける

/* * 2.Select TOP XXX を使ってみた */

SQLの基本とか言われそうだけど、 Select文で、条件を絞るのには、Whereの条件式を使います、 帰ってくる結果を調整する書き方、 Select TOP 30 なんて書き方ができるんですね。 ランキングの表示で、 Select URL, Count(URL) As URLCNT From log GROUP BY URL HAVING Count(URL) >= 50 ORDER BY Count(URL) DESC と、 SQL文 HAVING句でGroup化されたレコードに条件設定する http://www.ken3.org/cgi-bin/test/test043-1.asp で、 件数が50件以上の上位データを表示してましたが、 TOPってキーワードを使うと、TOP 20とか簡単にレコードセットを絞れます。 TOP 20で訪問者上位20件を表示 Select TOP 20 URL, Count(URL) As URLCNT と指定して、下記のSQL文を作成してみました。 Select TOP 20 URL, Count(URL) As URLCNT From log GROUP BY URL ORDER BY Count(URL) DESC 単に、Selectの次にTOP 20としただけでした(オイオイ) この指定だけで、TOP20のレコードセットを返してくれます。 SQL文 Select TOP 20 でGroup化集計値のTOP20を作成 http://www.ken3.org/cgi-bin/test/test083-1.asp でテスト可能です。

/* * 3.私が今ほしいのは、上位n件じゃなくて、21〜40件目のデータだけど */

TOPのキーワードを使うと、簡単にランキングをSQLで絞れそうなのがわかりました。 が、 私が探していたのは、 1ページ、20件単位の区切り(かたまり) たとえば、 2ページ目のデータ、21件目〜40件目のデータ を返す方法でした。 過去、 http://www.ken3.org/cgi-bin/test/test037-1.asp では、 Set rs = db.Execute("Select * From log ORDER BY WriteTime DESC") と、SQL文からレコードセットを作成して、 カウンタ変数を使用して、頭から30件になったらループを抜けてました。 'EOFまでループ or データ30件まで nCNT = 1 Do While rs.EOF = False And nCNT <= 30 '.EOFがFalseで30以下の間 Response.Write "<TR>" '内容を表示する ・ ・ rs.MoveNext 'これを忘れると悲惨なことに、、、 'カウンタを増やす nCNT = nCNT + 1 Loop こんな感じで、 Select * From log ORDER BY WriteTime DESC ↑書き込み時刻WriteTimeの降順(DESC指定)して作成したレコードセット をループで回しつつ、カウントを取り、制御してました。 Select TOP 999 で結果のレコードセットを制御できるので、 下記のSQL文を発行してテストしてみました。 Select TOP 30 * From log ORDER BY WriteTime DESC ~~~~~~~~~ ※なんか違和感あるよねSelect TOP 30 *ってのが、 トップさんじゅうアスタリスク?って感じでどこが切れ目だか・・  なれないと、TOPってフィールド名とか勘違いしそうです。 'Select TOP 30 と 件数を指定しました Set rs = db.Execute("Select TOP 30 * From log ORDER BY WriteTime DESC") ・   ・ 'EOFまでループ Do While rs.EOF = False '.EOFがFalseの間 と、レコードセットが指定した30件を返してくれるので、 カウンタで判断しないで、.EOFだけの判断としました。 SQL Select TOP 30 で 返って来るレコードセットを30件にする http://www.ken3.org/cgi-bin/test/test083-2.asp でテスト可能です。

/* * 4.期待したのに出来なかった書き方(笑) */

さて、ここまで、ひっぱってきました(オイオイ) 期待したのに出来なかった書き方(笑)があって、(失敗したよ・・・) そしたら、勝手な想像で、 ^^^^^^^^^^^^^^^^^^^^^^^^ Select TOP 10 to 20 なんて感じで、書けないかなぁ・・と思ったら、ムリだった。。。 これが出来れば、21〜40もと思ったけど。 ※もう少しSelect文の書き方、勉強しないとなぁ。。。 -- 余談 -- http://www.ken3.org/backno/backno_guchi36.html#181 で TimeAddって関数を予想する力? なんて、書いてたけど(注※TimeAddって関数は実際は無いので注意してね) Select TOP 10 to 20 ^^^^^^^^^^^^^^^^^^^ 想像だけで、無かったです(笑)できなかった(爆) まぁ、試行錯誤はタダだからいっかな。 ~~~~~~~~~~~~~~~~~~~~ みなさんは、いろいろと試してみて成功してヤッターの感覚を味わってね。 ※私は試行錯誤で、ヤッパダメか・・・が最近多い。  えっ、プログラマーの能力、見切りや予想の力が足りないって?  う〜ん・・・ http://www.ken3.org/backno/backno_guchi36.html#181  TimeAddって関数を予想する力? を発展させて、プログラマーの予想能力について、偉そうに書いてみようかなぁ。  愚痴マガ http://www.ken3.org/guchi/ もヨロシクです。

/* * 5.全体のn%のレコードを返す Top n PERCENT */

おまけで発見した、もう一つの指定方法 Select TOP 10 PERCENT これは、全体から頭10%を取得してくれます。 Select TOP 10 PERCENT URL, Count(URL) As URLCNT From log GROUP BY URL ORDER BY Count(URL) DESC と、SQLを作成して、発行してみました。 http://www.ken3.org/cgi-bin/test/test083-3.asp で、テスト表示を行ってます。 SQL、いろいろと書けるんですね。

/* * 5.終わりの挨拶 </HTML> */

今回は、 SQL文のSelect TOPの使い方でした。 狙っていた本題の20〜40の途中のレコード表示までは、いかなかったです。 いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 ASP、VBScript勉強中の三流プログラマーのKen3でした。


ページフッター

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

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

感想や質問・要望・苦情など 三流君へメッセージを送る。
返信例 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記事 バックナンバー目次]


広告: