-PR-
解決済み

Access2000での選択クエリの作り方

  • すぐに回答を!
  • 質問No.13797
  • 閲覧数147
  • ありがとう数3
  • 気になる数0
  • 回答数5
  • コメント数0

お礼率 42% (18/42)

例えば、以下のようなクエリを作りたいのですが、うまくいきません。作り方教えてください。

以下のようなテーブル、クエリから

      フィールド フィールド
テーブル1 選手ID  50m走タイム 
       1     9.5秒
クエリ1  選手ID   年齢
       1     21歳
テーブル2 年齢    タイム    得点
      20以下   7秒未満    10
      20     8秒未満     9
      20     9秒未満     8
      25以下   8秒未満    10
      25     9秒未満     9
      25     10秒未満     8

以下のようなクエリの作り方

クエリ 選手ID   50m走得点
      1     8点       

よろしくお願いします
通報する
  • 回答数5
  • 気になる
    質問をブックマークします。
    マイページでまとめて確認できます。

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

  • 回答No.5
レベル13

ベストアンサー率 46% (643/1383)

>ARCさん、割り込みですみません。間違ってましたら、フォローお願いします。

いえいえ。こちらこそ既にNiiさんが回答をつけていらっしゃるのに、割り込むような真似をして申し訳無しです。
この手の「こういうことは出来ないの?」系の質問を見ると、どうも答えたくてたまらなくなっちゃうんです(^^;
#3の回答も、「こんなやり方もあるよ」って言う意味で書いたものだったのです。

で、今回、私なりにいろいろ実験をしてみたんですが、いくつかやり方がある中で、#2の後半でNiiさんがお書きになられたモジュールを使うやり方が、速度面でも作業量の面でも優れているという結論に至りました。
クエリのみでも出来なくは無いですが、上記のような面で性能的に劣るようです。

以下、劣っているのを承知の上で、クエリを使ったやり方の改訂版を書いてみます(折角作ったのにもったいないから(苦笑))

○各テーブル、クエリには以下のようなフィールドがあるとする(数値型の後で、特に型の指定のないものは、どんな型であっても可)

クエリ1
  選手ID(数値型,長整数型)
  年齢(数値型)

テーブル1
  選手ID(数値型,長整数型)
  記録(数値型,単精度浮動小数点型)

テーブル2
  年齢層(数値型)
  記録層(数値型,単精度浮動小数点型)

○テーブル2には、以下のような感じでデータが格納されているものとする
年齢層 記録層  得点
    0    0    0
    0   200    1
    0   235    5
    0   275   10
   20    0    0
   20   205    1
   20   240    5
   20   280   10
   25    0    0
   25   200    1
   25   235    5
   25   275   10
   27    0    0
   27   197    1
   27   233    5
   27   270   10

○以下のようなクエリを作成する

[立幅跳び得点サブ1]

SELECT [クエリ1].[選手ID], [クエリ1].[年齢], Val(DMax("年齢層","テーブル2","[年齢層] <=" & [年齢])) AS 年齢層, [テーブル1].[記録]
FROM クエリ1 INNER JOIN テーブル1 ON [クエリ1].[選手ID]=[テーブル1].[選手ID];


[立幅跳び得点サブ2]

SELECT 立幅跳び得点サブ1.*, Val(DMax("記録層","テーブル2","[年齢層]=" & [年齢層] & " AND [記録層] <=" & [記録])) AS 記録層
FROM 立幅跳び得点サブ1;

[立幅跳び得点]

SELECT 立幅跳び得点サブ2.選手ID, テーブル2.得点
FROM 立幅跳び得点サブ2 INNER JOIN テーブル2 ON (立幅跳び得点サブ2.記録層 = テーブル2.記録層) AND (立幅跳び得点サブ2.年齢層 = テーブル2.年齢層);
ふぃ~ 疲れた(^^;
お礼コメント
Cloes

お礼率 42% (18/42)

ARCさん、Niiさん、大変、ありがとうございました。
おかげさまで、解決できました。
また、壁にぶつかることもあるかと思います。
その時はどうぞ、よろしくお願いします。
投稿日時 - 0000-00-00 00:00:00
-PR-
-PR-

その他の回答 (全4件)

  • 回答No.1
レベル10

ベストアンサー率 48% (79/162)

とりあえず、こんなのではどうでしょ?

50m走タイムを整数型に変換し、Partition関数に渡します。
タイム:Partition(Int([50m走タイム]),7,9,1)
この場合のタイムの取りうる値は
" : 7"
" 8: 8"
" 9: 9"
"10: "
の4通りと思われます。この文字列をテーブル2のタイムフィールドに設定します。

年齢も同様に
Partition([年齢],20,25,5)
として下さい。

タイムのパターン×年齢のパターン数のレコードをテーブル2に作成し、それぞれに得点を振って、完成かな?
補足コメント
Cloes

お礼率 42% (18/42)

Niiさん、回答ありがとうございます。
ただ、まだ、問題解決していません。
Partition関数は、クエリで使えるとの理解でおり、おっしゃるように、如何にテーブルでPartition関数を使うか、
ヘルプを見たりして努力しましたが、よくわかりません。
追加ご教示いただければ幸甚です。
投稿日時 - 0000-00-00 00:00:00

  • 回答No.2
レベル10

ベストアンサー率 48% (79/162)

テーブル1の50m走タイムフィールドのデータ型はSingle
クエリ1の年齢のデータ型は、Integerと仮定します。

テーブル1とクエリ1を元に、クエリ2を作成します。
フィールドは、選手ID タイム:Partition(Int([50m走タイム]),7,9,1) 年齢:Partition([クエリ1].[年齢],20,25,5)でいいでしょう。

テーブル2の年齢・タイムフィールドのデータ型は、Stringとし、Partition関数で返される形式で、入力しときます。
テーブル2 タイム 年齢    得点
  : 7     :20 10
  : 7    21:25 11
  : 7    26: 12
 8: 8     :20 9
 8: 8    21:25 10
 8: 8    26: 11
 9: 9     :20 8
 9: 9    21:25 9
 9: 9    26: 10

最後に、クエリ3を作成すればできあがり?

モジュールが理解できるならば、こういった方法もあります。
Function 得点(年齢 As Integer,たいむ As Single) As Integer
Select Case 年齢
Case < 20   '20歳以下
Select Case たいむ
Case < 7.0  '7秒以下
得点 = 10
Case < 8.0  '8秒以下
得点 = 9
Case < 9.0  '9秒以下
得点 = 8
End Select  'タイムの終わり
Case < 25

Case Else
End Select  '年齢の終わり
(記憶を頼りに書いてるので、間違ってるかも・・・)

こういったモジュールを用意して、保存しときます。
クエリの中から、50m走得点:得点([年齢],[50m走タイム])で標準関数みたいに呼びだしゃOKかな?

ん~、回答になってます?
  • 回答No.3
レベル13

ベストアンサー率 46% (643/1383)

いろいろ方法はあると思うんですが、クエリのみを使ったやり方を一つ。

○予備知識
SQLビューについて。
クエリをデザインする時に、[表示]-[SQLビュー]と操作すると、クエリを文字の形で表示、編集できるようになります。その後、[表示]-[デザインビュー]で、元のクエリデザインに戻ります。

クエリ作成のようなマウス操作を文字で伝えるのは非常にメンドクサイため(笑)、ここではSQLの形でクエリを扱うことにします。

回答のSQLの部分をメモ帳などにコピーして、テーブル名、フィールド名などを適宜書き換えます。そして、クエリを新規作成して、SQLビューに切り替え、メモ帳からSQLを貼り付けてご利用ください。


○作業用のクエリの作成
以下のクエリを新規作成して、「クエリ2」という名前で保存してください。

---切り取り線---
SELECT [クエリ1].[選手ID], Val(Partition([年齢],0,200,5)) AS 年齢層, Int([50m走タイム]) AS 記録層
FROM クエリ1 INNER JOIN テーブル1 ON [クエリ1].[選手ID]=[テーブル1].[選手ID];
---切り取り線---


○クエリの作成
同様に、クエリを作成して、以下の内容を貼り付けてください

---切り取り線---
SELECT 選手ID,年齢層, 記録層, DLookUp("得点","テーブル2","[年齢] = " & [年齢層] & " AND [タイム] = " & [記録層]) AS 得点
FROM クエリ2;
---切り取り線---
お礼コメント
Cloes

お礼率 42% (18/42)

ARCさん、回答ありがとうございます。
後、もうちょっとのところまで来ていると感じているのですが、まだ、完全解決していません。
テーブル2については、実際は、50m走ではなく、立ち幅跳びのデータで、以下のような形でやっています。
ご教示のとおり、SQL文でやったところ、DLookupを使ったクエリの得点フィールドがエラーで、「抽出条件でデータ型が一致しません」となってしまいます。尚、テーブル2の年齢、距離(タイムの代わり)、得点ともテキスト型です。
再度、ご教示ください。
ID年齢距離得点
1:29:1880
2:29189:1971
3:29198:2062
4:29207:2153
5:29216:2244
6:29225:2335
7:29234:2426
8:29243:2517
9:29252:2608
10:29261:2689
11:29269:10
投稿日時 - 0000-00-00 00:00:00
  • 回答No.4
レベル10

ベストアンサー率 48% (79/162)

ARCさん、割り込みですみません。間違ってましたら、フォローお願いします。

年齢・距離がテキスト型というのでしたら、下記のように変更すれば大丈夫と思います。

SELECT 選手ID,年齢層, 記録層, DLookUp("得点","テーブル2","[年齢] = '" & [年齢層] & "' AND [距離] = '" & [記録層]) AND "'" AS 得点
FROM クエリ2;

DLookup関数に渡している第3パラメータの条件で、データ型が数値型の時は、"[フィールド名] = " & [フィールド名]でいいのですが、テキスト型の時は、"[フィールド名] = '" & [フィールド名] & "'"としてあげる必要があったはずです。
このQ&Aで解決しましたか?
AIエージェント「あい」

こんにちは。AIエージェントの「あい」です。
あなたの悩みに、OKWAVE 3,500万件のQ&Aを分析して最適な回答をご提案します。

関連するQ&A
-PR-
-PR-
このやり方知ってる!同じこと困ったことある。経験を教えて!
このQ&Aにはまだコメントがありません。
あなたの思ったこと、知っていることをここにコメントしてみましょう。

その他の関連するQ&A、テーマをキーワードで探す

キーワードでQ&A、テーマを検索する
-PR-
-PR-
-PR-

特集


専門家があなたの悩みに回答!

-PR-

ピックアップ

-PR-
ページ先頭へ