売価変更がある商品の売上金額

このQ&Aのポイント
  • 売価変更がある商品の売上金額を計算する方法について教えてください。
  • 商品マスタと売上テーブルには、商品番号、新価格、旧価格、新価格適用日の情報があります。日付を入力してクエリを実行すると、日ごとの売上金額を求めることができます。
  • フォームの日付が新価格適用日よりも大きい場合は新価格が適用され、小さい場合は旧価格が適用されます。組み込む場所や方法についてのアドバイスをお願いします。
回答を見る
  • ベストアンサー

売価変更がある商品の売上金額

access2002 商品マスタ 商品番号,新価格,旧価格,新価格適用日 00000001, 120, 100,2006/10/01 00000002, 200, 180,2006/10/01 00000003, 100, 0,1900/01/01 00000004, 150, 0,1900/01/01 00000005, 220, 200,2006/10/01 売上テーブル  日 付 ,商品番号,売上数 2006/09/30,00000004, 200 2006/09/30,00000005, 20 2006/10/01,00000001, 100 2006/10/01,00000002, 10 2006/10/02,00000001, 80 2006/10/02,00000003, 120 2006/10/03,00000005, 50 上記のテーブルからフォームで日付を入力してクエリを実行し日ごとの売上金額を求めたいと思っています。 フォームの日付 >= 新価格適用日の場合は新価格 フォームの日付 < 新価格適用日の場合は旧価格 ということは分かるのですが、これをどこにどのように組み込んだらいいのかがわかりません。 よろしくお願いします。

  • shinp
  • お礼率33% (54/163)

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

  • ベストアンサー
noname#60992
noname#60992
回答No.4

No1です。 2回価格が変更になるとどのようなことになるのですか? 商品番号,新価格,旧価格,新価格適用日 00000001, 120, 100,2006/10/01 00000001, 100, 90,2006/11/01 みたいなことになるのかな?  それとも、2回価格が変更になるということはないのですか? 1回も価格が変更にならないものはどのようなデータなのですか? 商品番号,新価格,旧価格,新価格適用日 00000001, 120,,2006/01/01 こんな感じでしょうか? このようなものは、どちらかといえば価格変更ログであって、 商品マスタではないと思います。 順当に考えれば商品マスタを 新規に作り直したほうが簡単だとは思います。 このあたりの問題をまったく無視して考えれば、 以下のような[売上金額クエリ]というのを作れば、 動くには動きます。(あまりお勧めしませんが) SELECT 売上テーブル.日付, 売上テーブル.商品番号, 売上テーブル.売上数, -1*([商品マスタ]![適用日]-[売上テーブル]![日付]>0)*[商品マスタ]![旧価格]-([商品マスタ]![適用日]-[売上テーブル]![日付]<=0)*[商品マスタ]![新価格] AS 販売日価格, [売上テーブル]![売上数]*[販売日価格] AS 売上金額 FROM 売上テーブル LEFT JOIN 商品マスタ ON 売上テーブル.商品番号 = 商品マスタ.商品番号; 2回以上価格変更があるなら動きません。 やはり別途テーブルを作ったほうがよいと思います。

shinp
質問者

お礼

回答ありがとうございます。 2回価格が変更になると最初の価格はなくなります。常に1世代前の価格しか持てません。 1回も変更されていないデータは以下のようになります。 商品番号,新価格,旧価格,新価格適用日 00000004, 150, 0,1900/01/01 このマスタは、ン千万である会社に作ってもらったシステムの一部です。ですので別途テーブルを作成するにはその会社にお願いしなければなりません。 なぜこんな設計になったのかは分かりません。 そんなわけで取り敢えず既存の形を変えずに考えています。 教えていただいたクエリを試してみます。

その他の回答 (3)

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.3

>商品マスタは商品の価格が変わるたびにレコードは増えたりしませんが。。。 >どういうことでしょうか? 価格が変わらないのならこの質問自体がないわけですから 価格は変わるわけですよね で、変わった時、前の価格はどこに書くのですか? それが旧価格?だとしたらその前の価格はどこに行ってしまうの? 要するにテーブルの設計が悪いですよと指摘しているのですが

  • CHRONOS_0
  • ベストアンサー率54% (457/838)
回答No.2

いくつか問題点があるようですよ 商品マスタ マスタというのあまり変動しない半固定的なデータを集めたものにつけます また商品マスタというからには商品番号が主キーとなるテーブルでなければなりません アップされたものは商品の価格が変わるたびにレコードが増えていくものですから マスタではないですね また、価格の履歴テーブルなら旧価格フィールドは必要ありません 古い日付で旧価格のレコードが残っているはずです またそういう作りでないと売上日付に対応する価格は引っ張ってこれません 商品番号,価格,価格適用日 00000001, 100, 2005/10/01 00000001, 120, 2006/10/01 このテーブルなら商品番号が同じで売上日付より小さい最大日付のものを取ってくるということになります もうひとつの方法はNo1さんの案のように 適用開始日だけでなく終了日フィールドも設けたテーブルにするかです こっちの場合は商品番号で結合し売上日が開始日と終了日の間になる価格を取ってくる という風に抽出条件が簡単になります

shinp
質問者

お礼

回答ありがとうございます。 よくわからないのですが、 >アップされたものは商品の価格が変わるたびにレコードが増えていくものですから >マスタではないですね これは商品マスタについてのお話でしょうか? 商品マスタは商品の価格が変わるたびにレコードは増えたりしませんが。。。どういうことでしょうか?

noname#60992
noname#60992
回答No.1

このような場合は、商品マスタを 商品番号、価格、開始日、終了日、 00000001、100、20000101、20060930 00000001、120、20061001、99999999 のように作ったほうが、扱いやすいと思います。 商品番号,新価格,旧価格,新価格適用日 からそのようなテーブルを作ることも簡単にできますし、また再度価格変更があった際もそのまま対応できます。 

shinp
質問者

お礼

回答ありがとうございます。 おっしゃるとおり私もそのようなつくりであれば対応方法も分かるのですが、すでにマスタは作成してあり多量のデータが入力してあるので、できれば現状の形で対応したいと思っています。 この形では無理なのでしょうか。 よろしくお願いします。

関連するQ&A

  • 売上日より小さく且つ最大日の抽出

    以前こちらで商品の価格変更に対応するため履歴テーブルの作成を教えていただきました。作成したテーブルは以下のようなものです。 商品番号,価格,開始日,終了日 00000001,120,2006/01/01,9999/09/09 00000002,200,2006/01/01,2006/12/31 00000002,210,2007/01/01,9999/09/09 00000003,150,2006/01/01,2006/09/30 00000003,180,2006/10/01,9999/09/09 売上テーブルと履歴テーブルを使い売上金額を集計しています。 商品番号が複数存在する場合は売上日が開始日と終了日の間になる価格を取ってくるようにしています。 しかし現在、履歴テーブルの終了日は手入力しているため、この手間を省くため以下のようなテーブルへの変更を検討しています。 商品番号,価格,適用日 00000001,120,2006/01/01 00000002,200,2006/01/01 00000002,210,2007/01/01 00000003,150,2006/01/01 00000003,180,2006/10/01 このような履歴テーブルにした場合、商品番号が複数存在するときは売上日より小さく且つ最大日のものを抽出するようにしなければならないと思うのですが、うまくいかず売上日より小さい日付ものか最大日付のもののどちらかしか抽出できません。 どのようにしたらいいのでしょうか。 よろしくお願いします。

  • 商品番号を入力すると、商品名フィールドに自動で名前が出てくるようにしたいのですが・・・

     (ソフトはアクセスです)商品マスターのテーブルに商品のデータ(商品番号や単価など)を入力しておいて、売上明細(テーブルやフォーム)を入力する時に、商品番号を入力すると、商品名に自動で名前が出てくるようなシステム(?)をつくりたいのです。エクセルのVLOOKUP関数のような感じの。  自分なりにいろいろ試してみたのですが・・・。テーブルで設定するのですか?それともクエリー?リレーションはどのようにすればよいのでしょうか?詳しく教えていただけないでしょうか?よろしくお願いします。

  • Access マスターテーブル

    Accessについて。 テーブル1がID(主キー)、注文日、商品番号、納期など入力欄の項目で、テーブル2が商品番号(主キー)、商品名で商品のマスターテーブルになっています。 商品番号を入力すれば商品名が表示されるようにクエリを作成し、そのクエリからフォームを作っています。 ここまでは良いのですが、新しい商品番号を入力したときに限りフォームから商品名も入力する事でマスターテーブルに登録されるようにしたいのですが、どうすれば良いでしょうか?

  • Access アクセスについて

    Accessでデータベースを作っています。 テーブル、クエリは下記のようになっており、リレーションシップで紐付けしてあります。 クエリからフォームを作成し、商品番号を入力することでマスタテーブルに登録されていれば自動で商品名等の情報が表示されるようになっています。(フォーム1) 商品番号を入力しカーソルが移動した時、マスタテーブルに該当する項目がなかった場合、マスタテーブルから作成した新規追加用のフォームが表示されるようになっています。(サブフォームではありません) 新規追加用フォームに商品名を入力し、閉じてもフォーム1の商品名の欄に反映されません。新規追加用フォームを閉じる時にVBAで”Requery”,”Refresh”もやってみましたがダメでした。商品番号を入力し直すと表示されます。 どうすれば自動で商品名が表示されるようになるか教えてください。 テーブル1(入力用) 1.ID(主キー) 2.商品番号 3.etc. テーブル2(マスタテーブル) 1.商品番号(主キー) 2.商品名 3.etc. クエリ 1.ID(テーブル1) 2.商品番号(テーブル1) 3.商品名(テーブル2) 4.etc.(テーブル2) 5.etc.(テーブル1)

  • クエリのスピードアップ方法

    windows2000 access2002 在庫テーブル  日付、店番号、商品番号、個数 商品マスタ  商品番号、売価、原価 これらのテーブルを使い以下のクエリ1を作成しました。  日付、店番号、商品番号、在庫原価:個数*原価 さらにこのクエリを使い以下のクエリ2を作成しました。  日付、店番号、在庫原価の合計 クエリ1は実行するとサクっと表示されるのですが、クエリ2は実行してから20秒から30秒待たないと表示されません。現在のレコード320万件です。この件数は2倍から5倍に増える予定ですので、現時点でこの速度では件数が増えたときが心配です。 しかしテーブルは他のシステムでも使用しているので、手を加えることはできません。 なんとかもう少し早く表示させる方法はないでしょうか。 よろしくお願いします。

  • MS ACCESS 商品価格変更時の該当価格抽出方法の設定について

    私はACCESS初心者です。 会社用で商品受注履歴を閲覧出来る仕組みをACCESSにて、運用しております。 商品価格変更時の設定方法について質問させて下さい。 以前こちらでの類似質問履歴を参照させて頂き、下記のテーブルを作成しました。 テーブル名:フィールド内容 (1)商品マスター:商品ID、商品名 (2)価格マスター:商品ID、商品名、価格(単価)、適用開始日、適用終了日 (3)受注マスター:商品ID、商品名、販売日、数量 クエリ名:フィールド内容 (4)受注閲覧:受注ID、商品名、価格(単価)、数量、販売日 使用方法: (4)受注閲覧に、商品名、販売日(例:2007/7/1~2007/8/1)を入力し、 (3)受注マスターから、その期間に販売日設定された注文情報、およびその期間の商品価格を抽出する。 商品の価格変更時は、(2)価格マスターで商品ID・価格を新規入力しますが、 旧新価格とも商品名(主キー)が同じな為、(4)受注閲覧に販売日を入力した際、両方とも表示されてしまいます。 この時、「(2)価格マスター適用期間」の商品価格のみを引っ張り、(4)受注閲覧に表示出来る様にしたいのです。 色々と調べましたが、具体的な抽出条件が分からず、大変困っております。 是非アドバイスをお願い致します。

  • ACCESで集計(金額の合計)のクエリ

    お世話になっております。 下記の内容のACCESSのクエリで集計を行いたいのですが、 グループ化の機能(?)でうまくいきません。 どなたか、アドバイスいただけるとありがたいです。 ・・・クエリの内容・・・・ (1)テーブル 日付   商品 売上 3月1日 あめ  100円 3月2日 コーラ 200円 3月2日 あめ  100円 3月3日 せんべい150円 (2)クエリ結果 日付   売上集計 3月1日 100円 3月2日 400円 3月3日 550円 ・・・・ 初歩的な質問ですが、よろしくお願い致します。

  • 履歴を持つ商品マスターの取出し方

    逆引クエリーでも見つからなかったので 質問させて頂きます。 コード | 年月 | 価格 1 | 2006/12 | 100 * 2 | 2006/6 | 1000 2 | 2006/9 | 1200 2 | 2006/12 | 1500 * 3 | 2006/8 | 2200 3 | 2006/12 | 2000 * 4 | 2006/8 | 50 * 上記のように履歴を持った商品マスターがある場合、 直近のマスター (*のデータ) をクエリーで取出したい 場合は、クエリーデザインで抽出できますでしょうか。 もしくは、いくつかのクエリーを組み合わせてなど。 社内には、アクセスの有識者がいないため、行き詰まっており よろしくお願い致します。

  • Access 複数フォームを別フォームに反映させたい

    初めての投稿です。 よろしくお願い致します。 Accessにて店舗ごとの在庫管理をしたいのですが、T_入庫をフォームに作成しようとした所で詰まってしまいました。 以下、作成済みの3つのフォームと連結し、作成したF_入庫に反映させたいと思っています。 どうかご教授の下さいます様よろしくお願い致します。 連結したい3つのフォーム(作成済)です。 3つのフォームを連結させています。 T_商品マスター (メインフォーム) 商品ID 年度ID 商品区分 商品名 包装内容 包装量 単位 単価 適用チェック T_仕入マスター  (サブフォーム1) 仕入ID 商品ID 問屋ID メーカーID T_価格マスター (サブフォーム2) 価格ID 仕入ID 納入価格 価格登録日 適用チェック これから作成するフォーム T_入庫 入庫ID 仕入区分ID 店舗ID 入庫日 商品ID 入庫数 金額相違チェック 相違金額 とあります。 T__入庫でクエリを組み、演算子にて実行してみようと思いましたが、 それどころかT_入庫のテーブルとそのIDのフィールドを入れて組んでも表示されません。リレーションが悪いのかそれとも、テーブル設計そのものが悪いのか悩んでいます。 この様な場合、SQL文などわかっていないとダメでしょうか? どうかアドバイスお願い致します。m(__)m

  • Accessのフォームについて教えてください。

    こんばんは。アクセス入門者です。 入門書やできるシリーズなどいくつかのアクセスの本を見たのですが、 フォームについて、理解できません。 ●担当者マスタ ■客先マスタ ★コードマスタ ▲売り上げ計画マスタ ◎売上げ結果マスタ テーブルを作り、それぞれのテーブルから必要な項目を集めて、クエリを作成しました。思ったとおりの結果になったので、これを元にフォームを作成しました。 思ったとおりの結果が表示されるのですが、このフォームに入力が出来ません。できなかったので、次の方法を試しました。 ★コードマスタと▲売り上げ計画マスタのデータをサブフォームに配置しデータを追加させようと思って、あらたにフォームを作りました。やはり、思ったとおりの表示はされるのですが、追加ができないのです。それぞれのテーブルには、★コードマスタを主にそれぞれ、一対多にリレーションを組んでいます。 1つのフォームで色々なテーブルに結果を反映できるように、参照整合性の更新、削除にもチェックを入れました。 この考えは間違っているのでしょうか。 ○○マスタとあるように、それぞれ1つのテーブルに1つのフォームにしなければならないのでしょうか。 複数のテーブルから取り出したデータの更新は無理なのでしょうか。 ある程度、クエリまで完成したのにフォームでつまずいて苦しんでいます。ご解答宜しくお願い致します。