- ベストアンサー
クエリの抽出方法について
初心者です。教えて下さい。最新の販売日とその商品名を抽出したいのですが、クエリで販売日は「最大」にしていますが、それに対応した商品名がでてこないです。「最大」や「最後」でもうまくあわなく、最新の販売日に売れた商品名を呼び出すにはどのようにすれば良いのでしょうか?お力をお貸し下さい。よろしくお願い致します。
- みんなの回答 (7)
- 専門家の回答
質問者が選んだベストアンサー
(1)サブクエリ 顧客番号でグループ化 販売日を最大 (2)クエリ 顧客のテーブル、商品のテーブル、サブクエリを内部結合 簡単にクエリの機能を使ってやるならこんな感じ。 データが増えると効率的ではないかも。
その他の回答 (6)
- yoisho
- ベストアンサー率64% (331/516)
まず、以下のようなクエリーを作ってみてください。(クエリーのSQLビューにコピーして貼り付ければOKです。) ただし、顧客番号や販売日の入っているテーブルの名前を「販売実績」としています。 なお、このクエリーでは商品コードフィールドを表示させないでください。 SELECT 販売実績.顧客番号, Max(販売実績_1.販売日) AS 販売日の最大 FROM 販売実績 INNER JOIN 販売実績 AS 販売実績_1 ON 販売実績.顧客番号 = 販売実績_1.顧客番号 GROUP BY 販売実績.顧客番号; (クエリーに同じテーブルを二つ表示させると、二つ目は「テーブル名_1」という名前になります。) これでご希望の抽出ができそうでしたら、このクエリーと販売実績テーブルおよび商品テーブルを組み合わせて、以下のようなクエリーを作れば良いと思います。 ただし、前述のデータ抽出を行ったクエリーの名前を「抽出」としています。 なお、この際、販売実績テーブルと抽出クエリーは、顧客番号と販売日で結合してください。 SELECT 販売実績.*, 商品.商品名 FROM (販売実績 INNER JOIN 商品 ON 販売実績.商品コード = 商品.商品コード) INNER JOIN 抽出 ON 販売実績.顧客番号 = 抽出.顧客番号 AND 販売実績.販売日 = 抽出.販売日の最大; もし、一つのクエリーで処理したければ、サブクエリーの考え方を使って、以下のようにする方法もあります。 SELECT 販売実績.*, 商品.商品名 FROM 販売実績 INNER JOIN 商品 ON 販売実績.商品コード = 商品.商品コード WHERE 販売実績.販売日=(SELECT max(販売日) FROM 販売実績 AS 販売実績_1 WHERE 販売実績.顧客番号=販売実績_1.顧客番号); 蛇足ですが、顧客の氏名などのデータは、別に「顧客番号」と「氏名等」のフィールドを持つテーブルを作って、(販売実績テーブルではなくてこちらに入れて、)顧客番号で結合させた方が、データの保存スタイルとして効率的だと思います。
ということは、私が以前にお伝えした作業では、二つのテーブル間の「商品コード」のリレーションは正しく取れていたのですね? 残念ながら、「顧客番号をグループ化し、顧客一人ずつの最終購入日とその商品名の一覧を作成したい」というのは、ちょっと無理だと思います。 というのは、日付を「最大」にすると、そのテーブルの中で最も最近の「日付」を含んだレコードだけを抽出しようとするからです。 顧客によって最終購入日は違うわけですから、ここに矛盾が出てきます。 左から「顧客ナンバー」を「グループ化」、「日付」を「最大」、そして「商品コード」として、それでもダメなら、……無理かもしれません。
ということは、テーブルの数は二つですね。 顧客名や販売日等のあるテーブルをA、商品名と商品コードのみのテーブルをBとします。 試しに次のことをやってみてください。 クエリー作成時に抽出するフィールドは、Aのテーブルの全てのフィールド、プラス、Bのテーブルの「商品名」。その際、「最大」とかは一切指定しないでください。 いかがでしょうか? Aのテーブルにある全てのレコードが抽出され、それにBの「商品名」のフィールドがプラスされていれば、リレーションは適切に取れていると思われます。 リレーションが適切に取れていなければ、まずそのリレーションを作る必要が出てきます。
補足
説明が下手ですみません。上記の作業で数回購入者は、同じ顧客番号が並ぶため、グループ化し、顧客一人ずつの最終購入日とその商品名の一覧を作成したいと考えております。
テーブル間の各フィールドの、リレーションシップは適切でしょうか? そのデータベースには、どのようなテーブルがありますか? また、それぞれのテーブルには、どのようなフィールドがあるのでしょうか? まず、以上のことを伺う必要がありそうです。
補足
申し訳ございません。ひとつのテーブルが顧客番号、氏名等、販売日、商品コード、 もうひとつが、商品コード、商品名です。お願い致します。
テーブル間のリレーションが適切に組まれていることが前提ですが、 販売日は「グループ化」「昇順(降順だったか?)」にしてみてください。 「最大」は数値的に一番大きいものを抽出するときに使うものなので、日付には適用できないと思います。
補足
ありがとうございます。顧客番号でグループ化しています。販売日の最大で一番新しい売れた日は出ています。それに対応した商品名を出したいと考えております。よろしくお願い致します。
そのクエリーの元になっているのは別のクエリーですか? テーブルでしょうか? どちらにしても販売日の商品一覧が含まれるものがソースになっていれば、販売日(書式は日付)は最大でなく並べ替えを降順にします。一番新しいデータが最初になります。 クエリーのフィールドが販売日と商品名を含むクエリーであれば当然、新しいものがいちばん上に表示されるはずです。 以上、Access2000を例にしています。
補足
ありがとうございます。顧客番号でグループ化しています。販売日の最大で一番新しい売れた日は出ています。それに対応した商品名を出したいと考えております。よろしくお願い致します。
お礼
親身になってありがとうございます。また何か良い方法がございましたらよろしくお願い申し上げます。