• ベストアンサー
  • すぐに回答を!

[ACCESS97]SQLの書き方

グラフのレコードソースにクエリ・SQLを使用しています。データ入力チェックに使おうと思っています。妙なデータがはいった場合、グラフが乱れるのではないかと。 ソートは日付でしています。 それで、100レコードずつを順番に表示していきたいのですが、top値 だと最初からいくつ、、としか指定できません。これを、レコードの途中の任意の位置から取るにはどうしたらいいのでしょうか? IDとかのようにユニークな値でソートしているのであれば、大小関係で一発ですが、同じ値がいくつも存在する日付なもので困っています。 日付でソートしたものを配列に入れる、もしくは一度テーブルに書き出す等も考えているのですが、SQLでできたら助かります。 よろしくお願いします。

noname#27115

共感・応援の気持ちを伝えよう!

  • 回答数5
  • 閲覧数330
  • ありがとう数3

質問者が選んだベストアンサー

  • ベストアンサー
  • 回答No.3
  • maruru01
  • ベストアンサー率51% (1179/2272)

No.1です。 >たとえば、もう一つ順序管理するフィールドを作って、 >そこに順序を書き込むようなアクションクエリは >簡単にできないものでしょうか? テーブル構造が同じの空のテーブルを作成しておくのはどうでしょうか? ただし、元のテーブルのフィールドの他に、オートナンバーのフィールドを1つ追加しておきます。 そして、このテーブルへ、日付昇順で追加クエリを実行すれば、日付昇順で、オートナンバーにユニークな整数が入ります。 ユニークなので、確実に私のSQLで100個ずつ取り出せます。 一連の操作が終了したら、テーブルの全データを削除します。 ただし、オートナンバーの値は、前回の続きからで、どんどん大きな値になります。 しかしそれも、テーブルのデータが空の状態で、Accessの最適化をすればまた「1」からナンバリングされます。

共感・感謝の気持ちを伝えよう!

質問者からの補足

実は、作業MDBがあっていくつかは必要時にtemp tableを作ってそこで作業しています。でも、やっぱり、ちょっとレスポンスが悪いかなぁと思って、SQLで一発でやる方法を今回は考えてみました。 でも、その方法が一番わかりやすそうなので、今回もそれでやろうと思います。 Access2000とかだと、もうちょっといい方法があるだろうと思うんですが・・・ どうもありがとうございました。

関連するQ&A

  • AccessのSQL

    次のように同じ日付の中に複数の点数がある場合、 各日の最大点だけを表示するクエリを作りたいのですが、どのようにSQLを書けばよろしいでしょうか? SELECT MAX(点数) , 日付 FROM テーブル; ↑のような文では、エラーになってしまいました・・・ --------------------- 点数 日付 --------------------- 12 2005/11/22 23 2005/11/24 74 2005/11/24 20 2005/11/30 52 2005/11/30 --------------------- 以上、よろしくお願いいたします。

  • SQLの書き方がわかりません

    下記テーブルが access上にあります。 t1 ID 日付 01 2011/8/1 01 2011/9/1 02 2011/3/1 03 2011/5/30 t2 ID 日付 01 2011/7/1 01 2011/7/30 01 2011/8/1 01 2011/8/2 01 2011/9/2 02 2011/2/11 02 2011/3/1 02 2011/8/1 03 2011/4/30 03 2011/5/29 03 2011/6/30 このデータからt1を元に ID 日付1 日付2 01 2011/8/1 2011/8/1 01 2011/9/1 2011/8/2 02 2011/3/1 2011/3/1 03 2011/5/30 2011/5/29 というデータを取得するにはどのようなSQLを書けばよいでしょうか。 具体的にはt1とt2のIDが同じで、 t2の日付がt1の日付以下で最大のレコードと紐付けたいのです。

  • SQLのクエリで教えてほしいです。

    SQLのクエリで教えてほしいです。 ある列のTOP10を出してグラフを作成したいと考えております。 また、そのTOP10の行をカウントして何件あるかを知りたいのですが なかなか思うように動きません。 以下クエリを作ったのですが、結果に16行の結果(Top16?) になってしまいます。 また、一つのSQLで、Countも含めたいと思ってますが、こういった場合 はどこに記述すればいいのでしょうか。 select TOP (10) Percent hoge from hogehoge group by hoge order by hoge ご存知の方、よろしくお願い致します。

その他の回答 (4)

  • 回答No.5

#4です・・・手持ちのAccess(XPですが)で実行してみましたが・・・  ほんとですね。  いくつか実験してみると、どうも、UPDATE文のSET句へのサブクエリーが許されていない模様です・・・(何か、jet特有の制限があるのかも・・・)  というわけで、#4のアクションクエリーはどうも実行できないようです。  失礼しました。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ご回答どうもありがとうございました。 今後ともよろしくお願いいたします。 m(__)m

  • 回答No.4

 #2です。#3さんの回答で解決しているようですが、私への補足のアクションクエリーを書いておくことにします。  事前に、フィールドは準備されているものとして、そのフィールド名をjyuniとしておきます。 UPDATE tablea a SET jyuni =      (SELECT count(key1)+1 FROM tablea b       WHERE b.key1 < a.key1)  これで、jyuniにその時点での、各レコードの順位が入ると思います。  ちなみに、SQLの考え方は、前のSQLと同じです。

共感・感謝の気持ちを伝えよう!

質問者からの補足

こんにちは、ありがとうございます。 おっしゃっている内容は次のような感じだと思うのですが。 UPDATE テーブル AS A SET 順番 = (SELECT count(契約者ID) + 1 FROM テーブル AS B WHERE B.契約者ID < A.契約者ID ); これをやると、[更新可能なクエリである必要があります。] と出ます。 何が悪いのでしょうか?

  • 回答No.2

 topを使うのをあきらめて、次の感じではいかがでしょう。 select * from tablea a where (select count(key1) from tablea b where b.key1 < a.key1) between 99 and 199 order by key1;  とりあえず、ソートするフィールドをkey1としてみました。  小さい順に、上から取っていくようにしてありますが、逆順ならサブクエリーの不等号をひっくり返せばOKのはずです。同一順位を考えるなら、>=とすれば大丈夫かと。  SQLの発想は、ようするに、自分よりも小さな数字を数えて、それが、99個なら自分は100位であると書いてあります。  よって、betweenに記載する数値は、順位値-1です。  他のデータベースで実験してますが、多分、access97でもいけるでしょう。  ただし、このクエリー、かなりの演算量を要求しますので、遅いです。データ数が多いと・・・使えないかもしれません。

共感・感謝の気持ちを伝えよう!

質問者からのお礼

ありがとうございます。 データは今のところ3000件ぐらいですが、やっぱり、速度が。。。 それで、 たとえば、もう一つ順序管理するフィールドを作って、そこに順序を書き込むようなアクションクエリは簡単にできないものでしょうか?

  • 回答No.1
  • maruru01
  • ベストアンサー率51% (1179/2272)

こんにちは。maruru01です。 例えば、全レコード数が1000とすると、 まず降順にTOP 900(=1000-100)を取り出し、そこから昇順にTOP 100を取り出せば、結果的には101~200を取り出せると思います。 SELECT TOP 100 * FROM テーブル名 WHERE (((ユニークフィールド) In (SELECT TOP 900 ユニークフィールド FROM テーブル名 ORDER BY 判定フィールド DESC))) ORDER BY 判定フィールド; [判定フィールド]はTOP ○○を出すためのフィールドです。 [ユニークフィールド]はサブクエリーでデータ一致を判断するためのフィールドです。 ただし、境界で判定フィールドが重複する場合がやっかいかも知れません。

共感・感謝の気持ちを伝えよう!

質問者からの補足

どうもありがとうございます。 たとえば、同じ日付が120あって、最初に100番まで表示して、次の[次へ]ボタンかなんかで101から120とそれ以降の日付80レコードってのは無理っぽいですか?

関連するQ&A

  • フォームのレコードソース(Access2000)

    質問させていただきます。 フォームの「レコードソース」でテーブルとクエリーのほかに、「SELECT テーブル名、フィールド名・・・」というのがあります。これもクエリーなのでしょうか? ちなみに、レコードソースの右にある「---」をクリックすると「SQLステートメント:クエリビルダ」というものが開きます(クエリー画面と同じ?)。 また、フォームのレコードソースはテーブル、クエリー、SOLステートメントのどれにすれば良いのでしょうか?

  • ACCESS内の検索

    お世話になります。できるのどうかわからないのですが宜しくお願いします。 ACCESSを利用し在庫管理などを行っているのですがその際、例えばクエリ名「A」というクエリをレコードソースとしフォームを作るとします。さらに同じクエリをレコードソースとしレポートを作ります。こういったように同じクエリやテーブルを使用する場合、システムの規模が大きくなるとクエリやテーブルがどこでどのように使用しているか把握しきれなく、また時がたつにつれ忘れていってしまいます。そこで、クエリやテーブルがどこで(クエリ、フォーム、レポート、マクロ、モジュールなど)使用されているか検索できるようにするにはどうしたらよいでしょうか? 宜しくお願いします。

  • ACCESS2003でクエリの質問です

    クエリを教えて下さい。 ACCESS2003でクエリを作成したいのですが テーブルに以下のようにデータが入っています。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A         B    C 001 2008/08/27  D    E         F    G 002 2009/08/27       H         I 002 2008/08/27  K    L         M 002 2007/08/27  K    L    O    M 同一IDで日付の新しいレコードを抽出するのですが、 もしNULLの項目があれば、日付の古いレコードから編集したいです。 結果としては以下のようなテーブルを作成したいです。 [002]の[項目お]の様に過去日付のものがNULLであれば編集はしません。 ID   日付   項目あ 項目い 項目う 項目え 項目お 001 2009/08/27  A    E    B    C    G 002 2009/08/27  K    H    O    I また以下のように過去日付のデータが異なる場合は 事前のチェックでエラーとして別テーブルに出すように考えていますが、 こちらも合わせて教えていただけると助かります。 ID   日付   項目あ 項目い 項目う 項目え 項目お 003 2009/08/27  N    O    P         Q 003 2009/08/27  N    O    P    R    Q 003 2009/08/27  N    O    P    S    Q SQLが苦手で困っています。 宜しくお願いします。

  • SQLの性能

    クエリアナライザで実行すると30秒くらいかかるようなSQLがあるのですが、修正の余地について教えてください。 抽出元となるテーブルのレコード数が多くても、クエリの書き方やインデックスの張り方で速くなるのは知っていますが、限界はないのでしょうか? 単純に抽出元となるテーブルのレコード数が多いことが原因なのか、クエリやインデックスが原因なのかを判断する方法を教えてください。

  • ACCESSのSQLクエリについて質問です

    よろしくお願いします。 SQLのクエリで、 WHERE (((Year([日付01]))=Year(Date())) AND ((Month([日付01]))=Month(Date())+1)); と記述し、当月の翌月のテーブルを表示させていましたが、これだと12月の次は13月になってしまいます‥。 これをちゃんと翌年の1月が表示されるようにしたいのですが、どのようにすればよいかお教え頂けますでしょうか‥。 元々分かる方に教えて貰いながら作ったものなので、この文章だけで分かって頂けるか不安ですが、どうかよろしくお願いします。

  • Access クエリについて

    Accessのテーブル1に、フィールド「コード」「回数」があり、レコードとして A,32 B,20 C,13 ・・・というように、ランダムなコードと回数がセットされているとします。コードは主キーです。 このテーブル1を元にしたクエリで A,1 A,2 A,3 ・・・ A,32 B,1 B,2 ・・・ B,20 C,1 C,2 ・・・ C,13 というように、コードごとに「回数」と同じ数のレコードがクエリ上に生成されるようにしたいのですが、こういうことは出来るのでしょうか?出来ればSQLで回答いただけないでしょうか。

  • レコードソースにSQLを設定

    accessのレコードソースプロパティにテーブルやクエリではなく直接SQLを指定して条件にhitするデータだけ表示する方法がわからずに困っています。 SQLはメインフォームで入力した変数を持っています。 作業を効率化するために絶対に必要な機能なのでどうにかしたいです。 詳しい方アドバイスお願いします。

  • ソートに関して(ACCESS)

    教えて下さい。 あるテーブルに日付項目が2つ存在し、それら2つの項目を使って並び替え(昇順) をしたいと考えています。 《テーブル》  AAA 名前、日付1、日付2 山田,20130101, 山田,,20131201 山田,20130401, 結果として、 名前,日付X 山田,20130101 山田,20130401 山田20131201 という日付1と日付2がマージされた結果をソートするようなSQLができないかと考えて おります。 どのようなSQLを記述すれば良いか、教えて下さい。 よろしくお願いします。

  • SQLがわかりません。

    以下のTESTテーブルから以下の結果を表示するようなSQLを教えて頂けないでしょうか。 TESTテーブルでTYPE(1,2,3)を抽出して、2,1,3の順番にして それぞれのTYPEごとにDBIDでソートをしたいです。 どうかよろしくお願いいたします。 table TEST DBID | NAME | TYPE ------------------------------- 1 | A | 1 2 | B | 2 3 | C | 3 4 | D | 4 5 | E | 1 6 | F | 2 7 | G | 3 8 | H | 4 9 | I | 1 10 | J | 2 結果 DBID | NAME | TYPE ------------------------------- 2 | B | 2 6 | F | 2 10 | H | 2 1 | A | 1 5 | D | 1 9 | G | 1 3 | D | 3 7 | G | 3

  • accessとphpとsql

    現在、WEBからphpでSQLを使い、access(2002)にデータ入力とデータ参照するシステムを作成しています。 とりあえず両方できていますが、データ入力は複数人数で同時に更新(異なるレコード。テーブルは同一)することが想定されます。 排他制御はやりかたがわからずに組み込んでおりません。 ですが、入力者には個別のページに飛んでそこからデータを更新するようなWEBになっており、注意して作業してもらえば排他制御しなくてもいいかなと思っています。 ネットでaccessではデータの破損が起きやすいとありましたが、このような使用状況では起こりえるでしょうか? また、accessからmysqlなどに変更するメリットなどはありますでしょうか? よろしくお願いします。