0

我正在尝试建立一个表格来向我展示指定时间段内每天某件商品的价格。
我从三个表开始:

一个包含带有开始和结束日期的销售价格,一个包含物品的正常价格以及从该价格开始的时间,以及一个仅包含用于填写空白的日期的日期表。

表:

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 回答