• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:ACCESS同一日付内の特定レコード抽出)

ACCESS同一日付内の特定レコード抽出

このQ&Aのポイント
  • ACCESS同一日付内の特定レコード抽出についてアドバイスをお願いします。
  • 大田区のみを抽出し、日付の比較を行う等の複雑なコーディングが必要なのかについて教えてください。
  • 大田区が存在する日付ごとに別途料金を付加する方法についてアドバイスをいただけると幸いです。

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

  • ベストアンサー
  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.2

#1です その後、解決に向かっているのでしょうか。 #1では 1)クエリ「Q2」を作っておく方法 2)1)をサブクエリとして展開する方法 3)別途料金を分配する方法 4)一意に特定できるフィールドを使う方法 の4つを回答してみました。 上記1)~4)は、提示されたサンプルで動作すると思いますが、 実際のデータでは、どうなっているでしょうか。 1)2)であれば問題ないと思いますが、例えば、住所が微妙に異なる以下の様な場合 日付  住所     氏名  配送費 2/1  東京品川区  A商店  2000 2/2  東京大田区★ B商店  1500 2/2  東京大田区▲ C商店  1500 2/2  東京江東区  D商店  2500 2/3  東京新宿区  F商店  1000 2/3  東京大田区  C商店  1500 3)4)は意図した動きになっていないと思います。 以下の様な結果になっているかと思います。 日付  住所     氏名  配送費 別途料金 2/1  東京品川区  A商店  2000   2/2  東京大田区★ B商店  1500  1500 2/2  東京大田区▲ C商店  1500  1500 2/2  東京江東区  D商店  2500   2/3  東京新宿区  F商店  1000   2/3  東京大田区  C商店  1500  1500 これは、サブクエリ内の GROUP BY 指定を、日付, 住所 にしているため 「東京大田区★」と「東京大田区▲」は違うものとして扱われます。 4)の場合、GROUP BY から 住所 を削除することで動くと思いますが、 3)の場合は削除するだけでは意図した動きにはなりません。 やりたいことは、1)2)及び修正の4)でできているとは思います。 3)が必要であれば、解決に向けての進捗等補足ください。 (実際の住所はどんな感じになっているのかも併せて頂ければ・・・) なお、4)は、1)2)と異なり、同一日付内に同一氏名があっても大丈夫なはずです。

YU29068
質問者

お礼

30246kiku様 度重なるご配慮、誠に有難うございます。 お陰をもちまして無事に完成致しました。 取りあえずQ2方式で作成してみました。 何せCOBOLの経験が長かったものですから理屈では理解できのですが 実際となると奥が深いと感じています。 その他の方法も試して挑戦してみたいと思います。

その他の回答 (1)

  • 30246kiku
  • ベストアンサー率73% (370/504)
回答No.1

クエリのSQLビュー表示での回答で良いですか。 テーブル名を ★★ と仮定します。 以下、SQLビューに記述して、テーブル名を正式なものにして、各記述を データシートビューで表示したり、デザインビューで表示してみてください。 > いずれかに別途料金を まず、同一日付、住所に「大田区」がある「氏名」を求めておきます。(※1) SELECT 日付, First(氏名) AS S FROM ★★ WHERE 住所 Like '*大田区*' GROUP BY 日付; 「氏名」の順は考えないので、First() で求めておきます。 これを、クエリ「Q2」名で保存しておきます。 上記のクエリを使って最終表示にしていきます。(※2) (別途料金を 1500 と仮定します) SELECT Q1.*, IIF(IsNull(Q2.S),Null,1500) AS 別途料金 FROM ★★ AS Q1 LEFT JOIN Q2 ON (Q1.日付=Q2.日付) AND (Q1.氏名=Q2.S); この結果は 日付  住所    氏名  配送費 別途料金 2/1  東京品川区 A商店  2000   2/2  東京大田区 B商店  1500  1500 2/2  東京大田区 C商店  1500   2/2  東京江東区 D商店  2500   2/3  東京新宿区 F商店  1000   2/3  東京大田区 C商店  1500  1500 の様になると思います。 クエリ「Q2」として保存していましたが、クエリの個数が多くなるのも嫌なので クエリ「Q2」をサブクエリとして組み込みます。 SELECT Q1.*, IIF(IsNull(Q2.S),Null,1500) AS 別途料金 FROM ★★ AS Q1 LEFT JOIN (SELECT 日付, First(氏名) AS S FROM ★★ WHERE 住所 Like '*大田区*' GROUP BY 日付) AS Q2 ON (Q1.日付=Q2.日付) AND (Q1.氏名=Q2.S); ※2の LEFT JOIN Q2 の Q2 部分を (SELECT 日付, First(氏名) AS S FROM ★★ WHERE 住所 Like '*大田区*' GROUP BY 日付) AS Q2 として展開します。 ※※ これらの場合、同一日付内に同一氏名がないことが前提にあります。 なお、実際に別途料金を、その氏名先に請求することはないと思いますが、 請求する行為があったとしたら、公平に請求する以下の様なものでも良いのかも。 SELECT Q1.*, IIF(IsNull(Q2.CT),Null,1500/Q2.CT) AS 別途料金 FROM ★★ AS Q1 LEFT JOIN (SELECT 日付, 住所, Count(*) AS CT FROM ★★ WHERE 住所 Like '*大田区*' GROUP BY 日付, 住所) AS Q2 ON (Q1.日付=Q2.日付) AND (Q1.住所=Q2.住所); この結果は、※3 日付  住所    氏名  配送費 別途料金 2/1  東京品川区 A商店  2000   2/2  東京大田区 B商店  1500  750 2/2  東京大田区 C商店  1500  750 2/2  東京江東区 D商店  2500   2/3  東京新宿区 F商店  1000   2/3  東京大田区 C商店  1500  1500 また、テーブル ★★ 内にレコードを一意に特定できるものがあったら、 (以下では、オートナンバの「an」フィールドがあったとして) SELECT Q1.*, IIF(IsNull(Q2.A),Null,1500) AS 別途料金 FROM ★★ AS Q1 LEFT JOIN (SELECT Min(an) AS A FROM ★★ WHERE 住所 Like '*大田区*' GROUP BY 日付, 住所) AS Q2 ON (Q1.an=Q2.A); この結果は ※2と同様な an 日付  住所    氏名  配送費 別途料金 1  2/1  東京品川区 A商店  2000   2  2/2  東京大田区 B商店  1500  1500 3  2/2  東京大田区 C商店  1500   4  2/2  東京江東区 D商店  2500   5  2/3  東京新宿区 F商店  1000   6  2/3  東京大田区 C商店  1500  1500 になると思います。 ※ Min() 部分は First() でも Max() でも、いかようにでも 要は、Q2 としてどのレコードのもの・・・と限定して その限定したものとどのように結びつけるか、だと思います。

YU29068
質問者

お礼

回答有難うございます。

関連するQ&A