[三流君] −−> [ASPで遊ぶ、失敗する] −−> [バックナンバー一覧]
−−> No.089 SQL 集計関数MAXと副問い合わせ(サブクエリー)

SQL 集計関数MAXと副問い合わせ(サブクエリー)

SELECT文の出力結果をもう一つのSELECT文のWhereの条件にする、
下記のように、サブクエリーやクエリーの埋め込み、が可能です。
↑なんか変な日本語の説明ですね、日本語よりSQL文(言語SQL)を見てもらったほうがハヤイかな。
Select 列名
From テーブル名
 Where 列名 = (ここに条件として使いたいSQLをもう一つ書き込むことができます)

・一番多く購入した人のデータを取り出すには、
SQL文を下記のように作成することが出来ます。

'数量が一番大きい人を探すため、
'MAX関数を埋め込んだサブクエリー付のSQL文を作成する
strSQL = "Select 名前 "
strSQL = strSQL & " From kounyu "
strSQL = strSQL & " Where 数量 = (Select MAX([数量]) From kounyu)"
あとは、解説と実行サンプルを見てください。



本文(発行内容)


<SQL 集計関数MAXと副問い合わせ(サブクエリー)>

こんにちは、三流プログラマーのKen3です。 今回は、SQLの集計関数MAXと副問い合わせ(サブクエリー)を使ってみます。

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

掲示板 で 下記の質問をもらいました。 ----- タイトル:あまり初歩的ですいません ACCESS97のテーブル(下記)に「konyu」というテーブルがあり、 フィールド ID 数値型 とno 数値型があったとします。 IDの最大値のレコードのみ取得する場合 SQL ="SELECT * from kounyu where ID =(SELECT MAX(ID) from kounyu)"で取得出来るのですが、何故かnoの最大値のレコードを取 得できません。 SQL1 ="SELECT * from kounyu where no =(SELECT MAX(no) from kounyu)"ではダメ なのでしょうか? IDは1〜順番に付与され全レコードデータが入ってます noは後からinsert文で番号を入力するため、データが入ってたり 入ってなかったりします。 noのSQLを実行すると下記にエラーが表示されます。 「要求された名前、または序数に対応する項目がコレクションで見 つかりません。」 ----- ヤバイ・・・初歩的な問合せがわからないや・・・ 最近、初歩的と言われる問合せでハマッテマス・・・見かけ倒しの実力なので。

/* * 2.集計関数MAX */

SQLには、集計関数があって、SUM(項目名)だと、合計を計算してくれました。 あと、有名どころでは、MAX(項目名)で、最大値を返してくれます。 下記のテストデータを作成しました。 テーブル名:kounyu ID no 名前 金額 数量 1 100 Ken3 2000 5 2 20 けんぞう 100 200 3 250 あいうえお 1500 100 5 5 かきくけこ 55 55 6 10 さしすせそ 60 150 Select MAX(ID), MAX(no), MAX(金額), MAX(数量) From konyu と、SQL文を作成してみた。 'MAX関数を使用したSQL文を作成する strSQL = "Select MAX(ID), MAX(no), MAX(金額), MAX(数量) " strSQL = strSQL & " From kounyu " こんな感じで、文字列を作成して、 Set rs = db.Execute(strSQL) 'SQL発行、レコードセットの作成 で、レコードセットを作成してみました。 すると、結果は、 Expr1000 Expr1001 Expr1002 Expr1003 6 0 2000 200 んっ? 項目名が勝手に付いているのはまぁゆるすとして、 MAX(no)が0だよ・・・なぜ?250が返ってくれないとね。 ↑なぜかMAX(no)で0が返ってきた結果画面 なんか、noって名前が怪しいんだろうなぁと勝手な予想。 よく聞く話だと、予約語って感じかなぁ。 []で囲うと動く、そんな話も目にしてたので、SQL文を少し細工する。 'MAX関数を使用したSQL文を作成する strSQL = "Select MAX(ID), MAX([no]), MAX(金額), MAX(数量) " strSQL = strSQL & " From kounyu " と修正してみると、 http://www.ken3.org/cgi-bin/test/test089-1.asp で、テストすると、なんとかOKですね。 no等の予約語は、[]で囲うと正しくフィールドとして認識される。 ^^^^^^^^^^^^^^^^^^^^^^^^^^ 頭のスミに入れて置いてください。 --- 枠外解説・愚痴 --- フィールド名の頭に必ずF_と接頭語じゃないけど、付けて設計する先輩が居た。 そんな人達は、今回の[no]問題/予約語には、引っかからないのだろう。 コーディングミスを誘発しないテーブル設計ってのも必要ですね。

/* * 3.副問い合わせ(サブクエリー)を使い、最大値の行を表示してみる */

掲示板の質問で勉強した・・・なんて言っていると怒られるけど、 テーブル名:kounyu ID no 名前 金額 数量 1 100 Ken3 2000 5 2 20 けんぞう 100 200 3 250 あいうえお 1500 100 5 5 かきくけこ 55 55 6 10 さしすせそ 60 150 とデータがあった時に、 ・一番多く購入した人のデータ ・noが一番大きい人 を検索する場合 プログラムの組み方は、いろいろとあると思います。 データが少ないなら、全てのデータを頭から見ていき、 最大値のデータを代入する、そんな方法もありますが、 SELECT文の出力結果をもう一つのSELECT文のWhereの条件にする、 サブクエリーやクエリーの埋め込み、そんな方法をテストしてみます。 なんか変な日本語の説明でしたが、 Select 列名 From テーブル名  Where 列名 = (ここに条件として使いたいSQLをもう一つ書き込むことができます) ・一番多く購入した人のデータ を取り出すSQL文を下記のように作成することが出来ます。 '数量が一番大きい人を探すため、 'MAX関数を埋め込んだサブクエリー付のSQL文を作成する strSQL = "Select 名前 " strSQL = strSQL & " From kounyu " strSQL = strSQL & " Where 数量 = (Select MAX([数量]) From kounyu)" なんだぁ?こんなもん?って感じですが、 SQL文の幅が広がったと思います。 http://www.ken3.org/cgi-bin/test/test089-2.asp で、テストできます。 サブクエリー/SQL副問合せ、頭のスミにでも入れて置いてください。

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

今回は、 MAX関数を使った時、noのフィールド名は予約語なので[no]としてください。 サブクエリー/SQL副問合せを使ってみました。 いろいろと問題点を残しつつ、脱線・寄り道の多いメルマガですが、 今後とも、よろしくお願いします。 何かの参考となれば幸いです。 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記事 バックナンバー目次]


広告: