SQL查询来组合多个表中查找每天

问题描述:

我想建立一个表,告诉我一个项目的价格每天都在指定的时间内项目的价格。
我开始用三个表: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:

itemid, price, price_date_start, price_date_end, is_sale_price 

从应用的角度来看,并不需要是销售价格和正常价格之间的区别。所有价格都有开始日期和结束日期,但当前价格的结束日期可能未知。无论价格是否为销售价格,只从商业角度来看很重要,我添加了一个专栏来保持管理层的满意。

在这一点上我必须指出,这是不是很有效,或者有助于获得数据库制作上每一个日期的价格列表。数据库只需向您提供有关价格何时发生变化的信息,因为价格在每次价格变化之间保持不变。

如果你绝对要得到数据库输出为每天的值,就可以完成,通过加入我的顺序或查看日期描述表,因为你原本打算。这是相对简单的,但我不会发布解决方案,因为担心有人会采用它。

这是一个事实,即正常价格表中有一个起始日期作出要复杂得多,但不是一个结束日期,即使(我假设)的正常价格会随时间改变。

我建议是这样的:

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