2010-10-21 74 views
0

我想建立一個表,告訴我一個項目的價格每天都在指定的時間內項目的價格。
我開始用三個表:SQL查詢來組合多個表中查找每天

一個包含銷售價格有開始和結束日期,一個包含項目的正常價格,當它開始在這個價格,而只是有填補日期一個日期表在空白處。

表:

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,我已經寫了一些查詢,試圖結合這些,但他們無法正常工作 - 我也不認爲我是在正確的軌道上。

有人可以幫忙嗎?

+0

請張貼一些示例代碼,讓我們開始。 – drudge 2010-10-21 23:33:23

回答

1

你需要做的第一件事是簡化架構。

你只需要對價格信息表1:

itemid, price, price_date_start, price_date_end, is_sale_price 

從應用的角度來看,並不需要是銷售價格和正常價格之間的區別。所有價格都有開始日期和結束日期,但當前價格的結束日期可能未知。無論價格是否爲銷售價格,只從商業角度來看很重要,我添加了一個專欄來保持管理層的滿意。

在這一點上我必須指出,這是不是很有效,或者有助於獲得數據庫製作上每一個日期的價格列表。數據庫只需向您提供有關價格何時發生變化的信息,因爲價格在每次價格變化之間保持不變。

如果你絕對要得到數據庫輸出爲每天的值,就可以完成,通過加入我的順序或查看日期描述表,因爲你原本打算。這是相對簡單的,但我不會發布解決方案,因爲擔心有人會採用它。

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 
+0

這是正確的,正常的價格可以隨時間變化。當你引用'p.itemid'時,哪張表是p。引用?我想要一個表格/輸出的原因是我最終想製作一些圖表。 – user483641 2010-10-22 22:50:49

+0

@ user483641:對不起,應該是r.itemid - 我現在已經相應地修改了SQL。 – 2010-10-23 11:00:55