• ベストアンサー

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

以前こちらで商品の価格変更に対応するため履歴テーブルの作成を教えていただきました。作成したテーブルは以下のようなものです。 商品番号,価格,開始日,終了日 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 このような履歴テーブルにした場合、商品番号が複数存在するときは売上日より小さく且つ最大日のものを抽出するようにしなければならないと思うのですが、うまくいかず売上日より小さい日付ものか最大日付のもののどちらかしか抽出できません。 どのようにしたらいいのでしょうか。 よろしくお願いします。

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

  • ベストアンサー
回答No.2

sqlが間違えていましたね。最後は[asc]ではなく、[desc]になりますね。 で、フォームとかクエリとかかかれているので、ms accessで実現したいということですね? 先頭行を取得するにはTOPという構文が使えたかと思います。 select top 1 ....みたいに書けば、先頭行を取得できるかと思いますが、いかがでしょうか?  コメントですが、基本的に売上テーブルのような業務系トランザクション系のテーブルでは その時の価格を逐次記録した方がよいです。何かのタイミングで間違えて価格や適用日が変わってしまうことを考えると、全ての売上金額に影響を受けることになります。つまり、 売上テーブルは以下の構成にしておく方がお勧めです。 売上日,商品番号,売上数,売上単価,売上金額

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (3)

noname#246547
noname#246547
回答No.4

DBMSが判らないので通用するかどうか保障しませんが、下記のSQLはどうですか? select 商品番号,売上数,(※) as kakaku from 売上テーブル as u where u.日付 = 'フォームで入力した日'; ※の部分(ごちゃごちゃするので分けました) select 価格 from 履歴テーブル as r where r.商品番号 = u.商品番号 and r.適用日 <= u.日付 order by r.適用日 desc limit 1 サブクエリーで「日付」以前でもっとも新しい「価格」を1件取得すればいいんじゃないかな?

全文を見る
すると、全ての回答が全文表示されます。
noname#182251
noname#182251
回答No.3

>売上日より小さく且つ最大日のもの が、トリッキーな構造だと考えます。 「売上テーブル」に「履歴テーブル」の商品価格IDフィールドを追加すれば、扱いも簡単だし、関係も明瞭になるでしょう。

全文を見る
すると、全ての回答が全文表示されます。
回答No.1

sqlの質問になるのでしょうか? sqlならば、 select 履歴テーブル.価格, 履歴テーブル.適用日 from 履歴テーブル where 履歴テーブル.商品番号=xxxxx and 履歴テーブル.適用日<= 売上日 order by 履歴テーブル.適用日 asc; で取得できる一番最初のレコードを取得すると、ご希望の価格が取れると思います。

shinp
質問者

お礼

済みません。私の説明が悪かったようで質問の意図が伝わらなかったと思います。 履歴テーブル 商品番号,価格,適用日 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 売上テーブル  日 付 ,商品番号,売上数 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 上記の2つのテーブルからフォームで日付を入力してクエリを実行し日ごとの売上金額を求めたいと思っています。 このとき履歴テーブルに同一商品番号が複数存在する場合、売上日より小さく且つ最大日の価格で計算しなければならないのですが、それをどのように実現したらいいのかが分かりません。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

関連する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 上記のテーブルからフォームで日付を入力してクエリを実行し日ごとの売上金額を求めたいと思っています。 フォームの日付 >= 新価格適用日の場合は新価格 フォームの日付 < 新価格適用日の場合は旧価格 ということは分かるのですが、これをどこにどのように組み込んだらいいのかがわかりません。 よろしくお願いします。

  • SQLで、指定日に一番近いレコードだけ抽出

    Linuxサーバーで、MySQLを使っています。 商品テーブルの中で、 同じ商品のレコードが複数あります。 (例です。本来ならそんなつくりのテーブルは作らないです。) その多数のレコード中に、日付項目があります。 そこから、 1)商品毎に、2)指定日に、3)一番近い過去未来の日の、4)レコードだけを抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.未来に複数ある日付の中から、指定日に、一番近いレコード。 3.同一商品レコードは、複数抽出されない。

    • ベストアンサー
    • MySQL
  • Accessのクエリ。日付と顧客で売上合計をだす。

    期間を指定して、顧客の売上を合計したいです。 2つのテーブルからクエリを作成しました。 tbl顧客 顧客番号 顧客名 tbl販売 販売番号 日付 顧客番号 金額 Q_売上 日付 顧客番号 顧客名 金額 ∑をクリックして、金額の集計は[合計]にしています。 その他は、[グループ化]です。 日付の抽出条件は、 Between [開始] And [終了] としています。 顧客毎に合計を出したいです。 よろしくお願い致します。

  • 範囲設定のある条件に対する抽出について

    下記の様に二つのテーブルがあります。1つのテーブルにコード範囲と箱番号が設定されており、もうひとつのテーブルに商品コードが入っています。例えば、発注テーブル1:IDの1と2は、商品テーブル1のコード開始番号とコード終了番号でみると箱番号のレコード1の範囲に入っているので、商品テーブル1:箱番号”1”を抽出。このように対応している箱番号を発注テーブルを基準に、それぞれ抽出したい場合はどうしたらよいのでしょうか? 判り難くて申し訳ないのですが、よろしくお願いします。 ex テーブル1:商品テーブル1 箱番号,コード開始番号,コード終了番号 1,1000001,1000100 2,1000101,1000300 3,1000301,1000350 テーブル2:発注テーブル1 ID ,商品コード 1,1000005 2,1000017 3,1000213

  • Access データ抽出および集計の方法

    Access2016を使って下記データ抽出および集計をしたいのです。 テーブルA 商品CD 契約日 会社CD テーブルB 会社CD 契約期間開始日 契約期間終了日 テーブルC 商品CD 商品種別 テーブルAとテーブルCの商品CDをリレーション テーブルAとテーブルBの会社CDをリレーション 集計したいデータ 契約日が期間開始日~期間終了日に含まれるテーブルAのデータを抽出したいです。 これが取れれば、クロス集計で会社CD毎の商品種別の数を最終的に計算します。 期間開始日~期間終了日はそれぞれの会社CD毎に違います。 また、同じ会社CDに開始日~終了日以外の日付データも含まれています。 このような抽出はできないでしょうか?

  • SQLで、指定日に日付条件で抽出方法

    商品テーブルの中で、 同じ商品のレコードが複数あります。 その多数のレコード中に、日付項目があります。 そこから、 1)指定日に、2)一番近い過去の日の1件、3)指定日を含めて、複数ある指定日及び未来の全レコード、を抽出するには、 どのようなSQL文を書けばよいでしょうか? 1.過去に複数ある日付の中から、指定日に、一番近いレコード。 2.指定日と未来に複数ある日付の中の、全ての未来の、レコード。 レコードの例) 指定日=2015-07-01 商品ID 日付 1  2015-10-11 ・・・未来 ⇒ 抽出したい 1  2015-08-02 ・・・未来 ⇒ 抽出したい 1  2015-07-01 ・・・指定日 ⇒ 抽出したい 1  2015-07-01 ・・・指定日 ⇒ 抽出したい 1  2014-01-01 ・・・過去 ⇒ 抽出しない★ 1  2015-06-03 ・・・過去 ⇒ 抽出したい 2  2015-10-11 ・・・未来 ⇒ 抽出したい 2  2015-08-02 ・・・未来 ⇒ 抽出したい 2  2015-07-01 ・・・指定日 ⇒ 抽出したい 2  2015-07-01 ・・・指定日 ⇒ 抽出したい 2  2014-01-01 ・・・過去 ⇒ 抽出しない★ 2  2015-06-03 ・・・過去 ⇒ 抽出したい

    • ベストアンサー
    • MySQL
  • Accessで期間指定の売上合計と順位指定のクエリ

    Accessのクエリの質問です。 (1)期間を指定した、顧客の売上を合計。 (2)その順位を出し、1位~100位や250位などの順位を指定した抽出をしたいです。 (1)期間指定の売上合計はできています。 (2)の順位をDCountでしましたが、金額(集計:合計)にしているためか構文エラーがでます。 よろしくお願い致します。 ------------------------------------------------ 2つのテーブルから、Q_売上(クエリ)を作成しました。 tbl顧客 顧客番号 顧客名 tbl販売 販売番号 日付 顧客番号 金額 Q_売上 日付(集計:Where条件) 顧客番号(集計:グループ化) 顧客名(集計:グループ化) 金額(集計:合計) 日付の抽出条件は、 Between [開始] And [終了] としています。 ------------------------------------------------

  • 売り上げと原価を上下に並べて表示する

    以下のような売り上げテーブルと原価テーブルがあります。 売り上げテーブル 店番号,日付,売り上げ 000001,20051201,50000 000001,20051202,40000 000002,20051201,150000 000002,20051202,100000 000003,20051201,30000 000003,20051202,40000 原価テーブル 店番号,日付,原価 000001,20051201,30000 000001,20051202,20000 000002,20051201,70000 000002,20051202,50000 000003,20051201,15000 000003,20051202,20000 この二つのテーブルから年と月を指定して以下のような表を作成したいのですが、どのように行えばいいのでしょうか。 2005年12月 店番号,日付 01, 02,... 000001,売上, 50000, 40000... 原価, 30000, 20000... 000002,売上,150000,100000... 原価, 70000, 50000... 000003,売上, 30000, 40000... 原価, 15000, 20000... よろしくお願いします。

  • accessの複数条件での抽出

    2つのテーブルがあります。 テーブルA 商品 価格 数量 テーブルB 商品 価格 数量 この2つのテーブルから、同じ商品を抽出して、尚且つ価格が異なるものを抽出したいのですが、この作業を一括で行うことは可能でしょうか。 今のところは同じ商品のものを新たなテーブルに作成して、 その中から異なる価格のものを抽出している状態です。

  • クエリで抽出したデータの累計

    管理番号  試験時間  開始日付  終了日付   1     24 2012/1/1   2012/1/2 2 48 2012/1/1 2012/1/3 1 24 2012/1/2 2012/1/3  2 48 2012/1/3 2012/1/5 3 24 2012/1/1 2012/1/2 こういうデータから例えば、管理番号1を抽出して 管理番号  試験時間  累計  開始日付  終了日付   1 24 24 2012/1/1 2012/1/2 1 24 48 2012/1/2 2012/1/3 となるようにしたいのですが、 どなたか教えていただけませんでしょうか。 よろしくお願いします。