• ベストアンサー

日付により変動する「単価」を取得するSQLを教えてください

seimurakamの回答

回答No.2

自分もこれと同等の形式のテーブルを持つシステムに関わったことがあります。 ある日の単価のレコードを引くSQLはこんな感じです。 select * from 商品価格 where 商品ID = [商品ID] and 商品詳細ID = [商品詳細ID] and 単価適用日 = ( select max(単価適用開始日) from 商品価格 where 商品ID = [商品ID] and 商品詳細ID = [商品詳細ID] and 単価適用日 <= [対象日付] ) ※以下ご参考まで 自分の関わった環境は、商品マスタ=10万行、商品価格=100万行ほどだったのですが、 パフォーマンス上の問題から結局、商品価格テーブルに適用終了日を追加して、 [対象日付] between 適用開始日 and 適用終了日 で検索する形式に変更しました。

k_yukichan
質問者

お礼

早速の回答ありがとうございます。 SQL参考になりました。 >パフォーマンス上の問題 なるほど、私がいま開発中のものはそこまで商品点数を想定していませんが、今後のことを考えるとテーブル設計を見直す必要があるかもしれませんね。

関連するQ&A

  • SQLを教えてください。

    以下に5つのテーブルがあるとします。 (1)全体テーブル  ・登録順番号(Key)  ・登録名 (2)商品テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・品名 (3)商品単価テーブル  ・項目コード(Key)  ・品名コード(Key)  ・商品登録順番号(Key)  ・商品サイズ(Key)  ・登録順番号(Key)  ・商品単価 (4)新_商品単価テーブル  ・項目コード(Key)  ・品名コード(Key(Key))  ・商品登録順番号  ・商品サイズ(Key)  ・登録順番号(Key)  ・新_商品単価 (5)詳細テーブル  ・登録順番号(Key)  ・品名コード(Key)  ・原価項目コード(Key)  ・商品数量A  ・商品数量B 上記のテーブルから、以下の条件に合致する「(1)の登録名」「(2)の品名」「(4)の新_商品単価×(5)の商品数量※」を取得したい。 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 【条件1】全てAND条件 新_商品単価テーブルの項目コードが100  新_商品単価テーブルの品名コードが50 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※<0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 上記で抽出出来るレコードに加えて、以下 【条件2】全てAND条件 新_商品単価テーブルの項目コードが200~300あるいは400~500 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※=0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A どのようなSQLで抽出できますでしょうか?? DBはAccessです。

  • 日付により変動する「商品名」を取得するSQL

    日付により変動する「商品名」を取得するSQLを教えてください Web ORACLE + PHP によるアプリケーションを開発しています。 同じ商品コードで伝票の日付時点での適用されているマスタの商品名を 取得できるSQLを考えていますが良い考えが浮かびません。 たとえば、以下のように一覧が取得できないでしょうか? テーブル設計は以下のとおりです。 ブラウザによっては崩れて読みにくいかもしれません、ご容赦ください。 ■URIAGE_TBL(売り上げ伝票) ┏━━━━┳━━━━━┳━━━━━┓ ┃SEQ_NO ┃ SHO_CD ┃ DATE  ┃ ┃   1 ┃   01 ┃ 20100115┃ ┃   2 ┃   01 ┃ 20100205┃ ┃   3 ┃   01 ┃ 20101003┃ ┃   4 ┃   01 ┃ 20110302┃ ┃   5 ┃   01 ┃ 20110505┃ ┃   6 ┃   02 ┃ 20100308┃ ┃   7 ┃   02 ┃ 20101231┃ ┃   8 ┃   02 ┃ 20110222┃ ┃   9 ┃   02 ┃ 20110811┃ ┗━━━━┻━━━━━┻━━━━━┛ ■SHO_MST(商品マスタ) ┏━━━━┳━━━━━━┳━━━━━━━┓ ┃SHO_CD ┃ TEKIYO  ┃ SHO_MEI   ┃ ┃  01 ┃ 20100201 ┃カレー(1)   ┃ ┃  01 ┃ 20101003 ┃カレー(2)   ┃ ┃  01 ┃ 20110501 ┃カレー(3)   ┃ ┃  02 ┃ 20100201 ┃ラーメン(1)  ┃ ┃  02 ┃ 20101003 ┃ラーメン(2)  ┃ ┃  02 ┃ 20110501 ┃ラーメン(3)  ┃ ┗━━━━┻━━━━━━┻━━━━━━━┛ ★上記、2つのテーブルを見て期待している商品名の結果 SEQ_NO ┃ SHO_CD ┃ DATE  ┃SHO_MEI   ┃    1 ┃   01 ┃ 20100115┃       ┃    2 ┃   01 ┃ 20100205┃カレー(1)  ┃    3 ┃   01 ┃ 20101003┃カレー(2)  ┃    4 ┃   01 ┃ 20110302┃カレー(2)  ┃    5 ┃   01 ┃ 20110505┃カレー(3)  ┃    6 ┃   02 ┃ 20100308┃ラーメン(1) ┃    7 ┃   02 ┃ 20101231┃ラーメン(3) ┃    8 ┃   02 ┃ 20110222┃ラーメン(3) ┃    9 ┃   02 ┃ 20110811┃ラーメン(3) ┃ 補足です 1件目:日付が 20100115でマスタの適用よりも前のの日付なので空白 2件目:20100205でマスタの(商品コードが"01")適用の範囲が20100201~20101003の間なのでカレー(1)を表示 3件目:20101003でマスタの(商品コードが"01")適用の範囲が20101003~20110501の間なのでカレー(2)を表示 4件目:20110302でマスタの(商品コードが"01")適用の範囲が20101003~20110501の間なのでカレー(2)を表示長文申し訳ありません、よろしくお願いいたします。 5件目:20110505でマスタの(商品コードが"01")適用の範囲が20110501~なのでカレー(3)を表示 6件目:20100308でマスタの(商品コードが"02")適用の範囲が20100201~20101003の間なのでラーメン(1)を表示 7件目:20101231でマスタの(商品コードが"02")適用の範囲が20101003~20110501の間なのでラーメン(3)を表示 8件目:20110222でマスタの(商品コードが"02")適用の範囲が20101003~20110501の間なのでラーメン(3)を表示 9件目:20110811でマスタの(商品コードが"02")適用の範囲が20101003~の間なのでラーメン(3)を表示 長文申し訳ありません、よろしくお願いいたします。

  • ACCESS 商品毎の最新の単価を設定するには?

    ACCESS 商品毎の最新の単価を設定するには? 既に運用しているデータベースで不具合があり、以下のようなクエリを作りたいと考えていますが、データベースを作成してからかなり時間も経ってしまっており、自力で形にすることができません。 お知恵をお借りしたいと思いますので、よろしくお願い致します。 1.テーブル構成 [T_商品マスタ]--商品IDでリレーション設定--[T_単価マスタ] T_商品マスタのフィールド 商品ID(キー/数値型) 商品名1(テキスト型) 商品名2(テキスト型) 商品分類ID(数値型) 定価(通貨型) 取扱中止(Yes/No型) 販売単位(テキスト型) 備考(メモ型) T_単価マスタのフィールド 価格履歴ID(キー/オートナンバー) 商品ID(数値型) 仕入単価(通貨型) 仕入先ID(数値型) 販売単価(通貨型) 変更日(日付/時刻型)…Now()にて変更を入力した日付及び時刻を記録しています。 [Q_商品最終単価]…現在運用していますが、仕入単価及び販売価格が[T_単価マスタ]の最新のものにならない不具合が生じています(クエリ内の集計で"最後"を使用していますが最後=最新ではないとか、、、) クエリ内で設定している項目 商品ID 商品名1(単価を登録する度に変更することは禁止) 商品名2(単価を登録する度に変更することは禁止) 仕入単価(変更の度に[T_単価マスタ]の仕入単価欄に単価を入力して更新) 販売価格(仕入価格を入力するとフォーム上で自動計算) 変更日(仕入価格を入力した日時) クエリ時のイメージ 商品ID  商品名1  商品名2  仕入単価  販売単価  変更日 0001   うどん   稲庭    100     200     2010/01/01 10:10:16 0002   うどん   讃岐    150     300     2010/01/25 11:12:50 0003   そば    十割    200     400     2009/12/15 15:30:10 . . . 伝票入力時にこのクエリを用いて商品IDを入力することで、最新の単価を呼び出すようにしていたつもりでしたが、集計クエリの"最後"に信頼性が無いことがあるそうで、必ずしも最新の単価になっていないと発覚し冷や汗をかいております。 Q_商品最終単価の項目はそのままで、商品ID毎に最新の変更日に基づく最新の単価をクエリできる方法をご教授願います。

  • 株式の取得単価が変わることはありますか?

    前日に1716円にて仕込んでおいたとある銘柄を、翌日に1736円で売却したんです。 そして、その日の内にその同一銘柄を再び仕込もうと、大引け成りにて買い入れたのです。 自分が買い入れを確認した時の価格は1608だったのですが、後でトレーディングツールを開いて観てみると、取得単価が1662になっていました。 このようなことはあるのでしょうか? わかる方がおられましたら、何卒、ご享受ください。 ちなみに、その銘柄の終値は1601です。 この点からもありえないと思ったもので・・・。

  • 1つのSQLで2段階の抽出を行いたい

    恐らくそれほど複雑なSQLではないと思いますが、中々SQLが作成できず困っています。 回答いただければ嬉しいです。 以下のテーブルがあったと仮定します。 テーブル名:  売上げ明細 カラム:  ・商品ID … 売上げ明細なので一意ではありません  ・単価 … 同じ商品IDでも、レコードによって単価は異なります  ・数量 … 1~5の整数のみとします 実際のデータは以下の通りです。 商品ID,単価,数量 1001,50,2 1001,60,5 1002,90,3 1003,60,5 1003,80,4 1003,90,1 1004,60,3 上記データを以下の通り抽出するには、どのようなSQLを組めばいいでしょうか? 1.まず各商品IDの中から単価が最大のレコードだけを取り出す 商品ID,単価,数量 1001,60,5 1002,90,3 1003,90,1 1004,60,3 2.次に数量でgroup by して、件数をカウントする 数量,件数 1,1 3,2 5,1 1つのSQL文で2の結果が得られれば、途中の抽出条件は特に問いません。 ちなみにMySQL5を使っています。 よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Excelワークシート上にSQL文を書き込み取得したデータをワークシート上に取得

    はじめましてこんにちわ。 現在ExcelとSQLServerでADOを使ってデータを取得したいと思っています。 SQL文をワークシート上に書いてそれを読み込んでSQL文を実行するようにしたいのですが、それを取得したあと、データをExcelワークシートに表示させる方法が思いつきません。 SQL文で指定するデータは任意の文です。そのため取得されたフィールドがいくつできるかわからない状態です。 例えば、SQL文であったら SELECT 商品ID,商品名,価格 from 商品テーブル なりますが、商品ID,商品名,価格フィールドを自動的に Excelフォーム上に作りたいということです。 ・基本的にSELECT文しか使わない ・SQL文は任意のSQL文である の条件がありますがそれはできるのでしょうか? よろしくお願いします。

  • 3つのテーブルからの抽出SQL

    表1・・・商品ID 表2・・・商品ID、賞味期限、価格ID 表3・・・価格ID、商品価格 このような表があるとします。 ここで、商品価格ごとにもっとも賞味期限の古い商品IDを表示させてい場合、どのようなSQL文を書けばよいでしょうか? また、オラクル8でお願いします。 例題となるテーブルとレコードが紛らわしいですが、よろしくお願いいたします。

  • SQL文作成についてお知恵をお貸しください

    ユーザーと商品のテーブル(省略)、 商品ジャンルテーブル、 genre id   name 1   家電 2   3万円台 3   テレビ 4   黒 5   SONY 6   三菱 商品とジャンルのリレーションテーブル、 item_genre item_id genre_id 1    1 1    2 1    3 2    1 2    3 2    4 2    6 ユーザーが希望する商品ジャンルのテーブル(ユーザーとジャンルのリレーションテーブル)、 user_genre user_id genre_id 1    1 1    3 2    1 2    3 2    4 3    1 3    3 3    4 3    5 以上があるとします。 この時に商品側から(商品IDを元に)、その商品を希望しているユーザーIDを取得する場合の SQL文の作成方法のご教示をお願いいたします。 上記のテーブルの例ですと、アイテム1から取得したいユーザーIDは1、アイテム2からは ユーザーID 1と2を取得できればOKです。 商品が持つジャンルIDが1,2,3に対してユーザーが希望するジャンルIDが1,3のように少ない 場合は対象にふくまれますが、商品が持つジャンルIDが1,3に対してユーザーが希望する ジャンルIDが1,3,4のように多くなる場合は対象に含めません。 色々と考えてみたのですが、頭がこんがらがってしまい迷宮に迷い込んでしまいました。 すみませんがお知恵をお貸しください。よろしくお願いします。 ※DBサーバーがMySQLのため、MySQLで実現できる方法だとありがたいです。

    • ベストアンサー
    • MySQL
  • SQLコマンドによるデータ抽出について

    例えば 商品マスタという商品ID、商品名、単価のフィールドを含んだテーブルと 販売履歴というID、商品ID、販売日時というフィールドを含んだテーブルがあります。 各商品の一番最後に売れた販売日時を知るために この2つのテーブルからSELECT文で商品ID、商品名、販売日時の フィールドを結果として返すSQL文を作りたいです。 各商品なので全く売れていない商品でも商品IDと商品名だけは結果に欲しいです。 どなたかSQLに詳しい方、教えてください。

  • シーケンス型で取得した値を別テーブルで利用する方法

    シーケンス型で取得した値を別テーブルで利用する方法を別テーブルの設定したい場合,どうすればいいでしょうか. 例えば,商品情報が入っている商品テーブルのidを価格テーブルに結びつけたい場合 ・トランザクション開始 ・商品テーブルにinsert ・コミット ・トランザクション開始 ・シーケンスより最大値を取得 ・価格テーブルにシーケンスより得られた値を含めてinsert ・コミット このままですと価格テーブルの時に何らかの問題でロールバックした場合,商品テーブルには価格テーブルと関係性がないレコードができてしまいます.