

PostgreSQL + PHP による Web アプリケーションを開発しています。
ある日付時点での各商品単価が取得できるSQLを考えていますが良い考えが浮かびません。
たとえば、以下のように2009年11月18日時点での価格一覧が取得できないでしょうか?
牛丼(小)300円
牛丼(並)350円
牛丼(大)470円
サラダA 200円
サラダB 205円
サラダ盛合せ 498円
テーブル設計に問題があるのかもしれませんが...
テーブル設計は以下のとおりです。
ブラウザによっては崩れて読みにくいかもしれません、ご容赦ください。
■商品マスタ
┏━━━━┳━━━━━━━┳━━━━━━━┓
┃商品ID ┃ 商品詳細ID ┃ 商品名 ┃
┃ 1┃ 200┃牛丼(小) ┃
┃ 1┃ 300┃牛丼(並) ┃
┃ 1┃ 500┃牛丼(大) ┃
┃ 2┃ 1┃サラダA ┃
┃ 2┃ 2┃サラダB ┃
┃ 2┃ 3┃サラダ盛合せ ┃
┗━━━━┻━━━━━━━┻━━━━━━━┛
■商品価格
┏━━━━┳━━━━━━━┳━━━━━━━━━┳━━━━━━┓
┃商品ID ┃ 商品詳細ID ┃ 単価適用日 ┃ 単価 ┃
┃ 1┃ 200┃ 2009-10-01┃ 300┃
┃ 1┃ 200┃ 2009-11-30┃ 280┃
┃ 1┃ 200┃ 2010-02-05┃ 320┃
┃ 1┃ 300┃ 2009-10-01┃ 350┃
┃ 1┃ 300┃ 2009-11-20┃ 370┃
┃ 1┃ 300┃ 2010-03-01┃ 380┃
┃ 1┃ 500┃ 2009-09-30┃ 500┃
┃ 1┃ 500┃ 2009-10-15┃ 470┃
┃ 2┃ 1┃ 2009-10-01┃ 180┃
┃ 2┃ 1┃ 2009-10-18┃ 200┃
┃ 2┃ 2┃ 2009-09-05┃ 210┃
┃ 2┃ 2┃ 2009-09-20┃ 205┃
┃ 2┃ 2┃ 2010-02-02┃ 170┃
┃ 2┃ 3┃ 2009-09-01┃ 480┃
┃ 2┃ 3┃ 2009-09-15┃ 500┃
┃ 2┃ 3┃ 2009-11-02┃ 498┃
┃ 2┃ 3┃ 2010-01-20┃ 470┃
┗━━━━┻━━━━━━━┻━━━━━━━━━┻━━━━━━┛
長文すみません、よろしくお願いいたします。
No.3ベストアンサー
- 回答日時:
単価適用日のカラクリを考えると、指定日以前で最大の日付と一致する
データが対象となるようですね。
SELECT A.商品名,B.単価 FROM
商品マスタ A LEFT JOIN
(SELECT X.* FROM 商品価格 X LEFT JOIN
(SELECT 商品ID,商品詳細ID,MAX(単価適用日) 適用日 FROM 商品価格
WHERE 単価適用日<='2009-11-18' GROUP BY 商品ID,商品詳細ID) Y
ON X.商品ID=Y.商品ID AND X.商品詳細ID=Y.商品詳細ID
AND X.単価適用日=Y.適用日) B
ON A.商品ID=B.商品ID AND A.商品詳細ID=B.商品詳細ID
nda23 さま、再三のご回答ありがとうございます。
サンプルのSQL、、ズバリこれです!
わざわざ書いていただき申し訳ないです。
先に seimurakam さまが回答されたパフォーマンスのことも考えると
テーブル設計を考え直そうかなと思います。
しかし、とても興味深いSQLを書いていただき、大変参考になりました。
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 適用終了日
で検索する形式に変更しました。
早速の回答ありがとうございます。
SQL参考になりました。
>パフォーマンス上の問題
なるほど、私がいま開発中のものはそこまで商品点数を想定していませんが、今後のことを考えるとテーブル設計を見直す必要があるかもしれませんね。
No.1
- 回答日時:
商品マスタと商品価格を結合するのは?
SELECT A.商品名,B.単価 FROM
商品マスタ A LEFT JOIN
(SELECT * FROM 商品価格 WHERE 単価適用日='2009-11-18') B
ON A.商品ID=B.商品ID AND A.商品詳細ID=B.商品詳細ID
この回答への補足
早速の回答ありがとうございます。
申し訳ございません、私の主観のみで書いておりましたので、記載漏れがありました。
"商品価格" テーブルの "単価適用日" とは、その日付以降に適用される単価です。あらかじめ、未来日付の単価を登録することを想定としています。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- 経営情報システム accessでの請求管理について 12 2022/06/11 16:20
- 政治 日本がデフレな理由は 7 2022/04/18 12:48
- 簿記検定・漢字検定・秘書検定 簿記2級 売上原価の計算と期末商品の評価に関する質問 3 2023/06/24 23:50
- 債券・証券 高度な質問だと思いますが、知性あふれる方にお願いします。教えてください。 現在メットライフア◯コで積 7 2023/08/06 10:12
- 国産バイク 大型バイク カワサキz900rsに付ける ヨシムラのマフラーの質問です、 【 商 品 I D 】14 2 2023/06/27 13:43
- 大学・短大 至急お願いします 2 2022/04/26 13:59
- 会社設立・起業・開業 レンタル業を開業予定です。開業前の仕入れでレンタル商品の仕入れ経費について教えてください。 1 2023/01/14 18:27
- Excel(エクセル) 【エクセル関数】複数条件に該当する場合、別の列の数値を合算する。 9 2022/07/09 08:46
- SQL Server SQLのクエリの書き方 1 2022/03/29 23:06
- Visual Basic(VBA) 【ExcelVBA】Powerクエリーでいうピボット解除と同じ処理をVBAで 4 2022/07/06 17:09
このQ&Aを見た人はこんなQ&Aも見ています
関連するカテゴリからQ&Aを探す
おすすめ情報
このQ&Aを見た人がよく見るQ&A
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
テーブルの結合の仕方 MSAccess...
-
Excel VBA ADODB
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
ACCESS 商品毎の最新の単価を設...
-
フォームからの抽出結果をExcel...
-
Accessの実行時エラーについて
-
アクセス フィールド名に変数...
-
外部参照してるキーを主キーに...
-
差し込み後、元データを変更し...
-
SQLで特定の項目の重複のみを排...
-
フィルターかけた後、重複を除...
-
Outlook 送受信エラー
-
select文のwhere句に配列を入れ...
-
Access:クエリーにて集計後に...
-
SELECT 文 GROUP での1件目を...
-
エクセルの関数について教えて...
-
エクセルで最後の文字だけ置き...
-
VIEWの元のテーブルのindexって...
-
SQL Left Join で重複を排除す...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
EXISTSを使ったDELETE文
-
SQL文で、合計が0のレコードを...
-
Accessの実行時エラーについて
-
ACCESS ツリービューの作り方
-
ACCESS 商品毎の最新の単価を設...
-
日付により変動する「単価」を...
-
アクセス フィールド名に変数...
-
ACCESSでDLookUpすると、不正な...
-
Excel VBA ADODB
-
ACCESSでクエリ作成時複数のフ...
-
異なるデータベース間のテーブ...
-
ACCESSのマスタの変更について
-
Access2013で商品に複数の単価...
-
前月の取得について
-
日付の範囲検索で
-
アクセス★非課税、課税の合計金...
-
SQL2005 クエリ文について
-
AS400にてサブファイルレコード...
-
自己結合について
-
ビューの更新タイミング
おすすめ情報