0

指定した期間の毎日のアイテムの価格を表示するテーブルを作成しようとしています。
私は3つのテーブルから始めます:

1つは開始日と終了日の販売価格を含み、もう1つはアイテムの通常価格とその価格で開始した日時を含み、もう1つは空白を埋める日付だけを含む日付テーブルです。

テーブル:

Sale price table    :  itemid, price, sale_date_start, sale_date_end

Regular price table :  itemid, regularp, regularp_date

missing date table  :  missingdate (date table, with 5 years of dates by day)

アイテムには、複数の通常価格エントリと複数の販売価格エントリを含めることができます。私はSQLを初めて使用し、これらを組み合わせようとするクエリをいくつか作成しましたが、正しく機能しません。また、正しい方向に進んでいるとは思いません。

誰かが助けることができますか?

4

2 に答える 2

1

最初に行う必要があるのは、スキーマを単純化することです。

価格情報に必要なテーブルは 1 つだけです。

itemid, price, price_date_start, price_date_end, is_sale_price

アプリケーションの観点からは、セール価格と通常価格を区別する必要はありません。すべての価格には開始日と終了日がありますが、現在の価格の終了日は不明な場合があります。価格がセール価格かどうかは、ビジネスの観点からのみ重要ですが、経営陣を喜ばせるためにコラムを追加しました。

この時点で、データベースにすべての日付の価格のリストを作成させるのはあまり効率的でも有用でもないことを指摘しなければなりません。価格は各価格変更間で一定であるため、データベースは価格が変更されたときの情報のみを提供する必要があります。

データベースに毎日の値を出力させる必要がある場合は、最初に計画したように、日付のシーケンスまたはビューで説明したテーブルを結合することでそれを実現できます。比較的単純ですが、誰かがそれを採用するのではないかと恐れて、解決策を投稿するつもりはありません。

于 2010-10-22T00:02:06.617 に答える
0

これは、通常の価格テーブルには開始日がありますが、終了日がないという事実によって、はるかに複雑になります (私は推測していますが) 通常の価格は時間の経過とともに変化する可能性があります.

私は次のようなことを提案します:

SELECT missing_date price_date,
       r.itemid,
       CASE WHEN s.itemid IS NULL
            THEN r.regularp
            ELSE s.price
       END item_price
FROM missing_date m
JOIN (SELECT itemid, regularp, regularp_date start_date,
             (SELECT MIN(r2.regularp_date)
              FROM   regular_price r2
              WHERE  r2.item_id = r1.item_id AND 
                     r2.regularp_date > r1.regularp_date) end_date
      FROM   regular_price r1) r
ON   m.missing_date >= r.start_date and 
     (m.missing_date <  r.end_date or r.end_date IS NULL)
LEFT JOIN sale_price s
ON   m.missing_date >= s.sale_date_start and 
     m.missing_date <= s.sale_date_end and
     r.itemid = s.itemid
于 2010-10-22T12:34:46.047 に答える