- ベストアンサー
日付による商品名取得SQLの作成方法
- 日付により変動する商品名を取得するためのSQLクエリを教えてください。
- Web ORACLE + PHPのアプリケーション開発において、伝票の日付時点で適用されているマスタの商品名を取得する方法を考えています。
- URIAGE_TBL(売り上げ伝票)とSHO_MST(商品マスタ)という2つのテーブルを使用して、商品コードごとに日付の範囲内で適用されている商品名を取得するSQLを作成したいです。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
こんな感じでしょうか。 --全角でインデントしてます --dateという項目名は使えないのでdtとしてあります --dt、tekiyoは手抜きでnumber型でやっているので、実際の型に合わせて修正してください select t.seq_no,t.sho_cd,t.dt,m.sho_mei from URIAGE_TBL t left join ( select sho_cd ,tekiyo tekiyo_start ,lead(tekiyo,1,99991231) over(partition by sho_cd order by tekiyo) - 1 tekiyo_end ,sho_mei from SHO_MST) m on (t.sho_cd = m.sho_cd and t.dt between tekiyo_start and tekiyo_end) order by t.seq_no; Oracle10g XEで動作確認しましたが、ご使用のOracleのバージョンがわかりませんので、 バージョンによってはもしかしたら上手くいかないかもしれません。 確認ですが、ご提示のデータの場合では7件目と8件目は「ラーメン(2)」になるのではないでしょうか?
その他の回答 (1)
- SePapa
- ベストアンサー率50% (47/94)
こんにちは。 私はMSのSQLサーバしかわからないので オラクルのクエリは回答できませんが、 私が設計するのであれば、商品マスタの設計を見直します。 TEKIYOのように日付範囲のfromだけもつのではなく、 fromとtoの両方を持たせるのです。 例えば商品CD=01の1行目であれば ┃SHO_CD ┃ From ┃ To ┃ SHO_MEI ┃ ┃ 01 ┃ 20100201 ┃ 20101002 ┃カレー(1) とするのです。2月1日から10月2日であれば「カレー(1)」だというような データを持たせるようにします。 当然同一商品CDでFrom~Toの範囲が重複しないことが絶対条件です。 このようにしておけば、クエリで取得する際にBETWEEN(MSの場合)句で 伝票日付はFromとTOの間である商品名が取得できるのではないでしょうか。 ご参考まで。
お礼
返事遅くなりました。 凄く参考になり、期待する値が取れました。 ありがとうございました。