如何查询没有初始日期或结束日期的历史价格?

时间:2018-04-04 03:24:41

标签: mysql sql postgresql

我试图通过SQL查询来查找产生最少金钱的产品,但我遇到了一个问题,而且我有一张表可以跟踪不同的情况价格日期,例如产品1在2011-01-01和下一个价格变化日期之间购买的所有收件人的价格为5000,即2012-01-01,另一方面产品1具有最新价格价格日期为2015-01-01,价格为5600,这意味着从2015-01-01到实际日期购买的任何收件人的价格为5600.

这是当前问题的SQL小提琴:

http://sqlfiddle.com/#!9/62ec25/9

我所做的查询是为了得到答案:

select pr.productName, sum(d.quantity*p.price)
from details d, product pr, price p, recipts r
where d.Product_ref=pr.ref
and pr.ref=p.Product_ref
and r.numRecipt=d.Recipts_numRecipt
group by pr.productName
order by 2 asc;

我非常确定查询是错误的,因为我没有考虑每种产品的历史价格,但我找不到一种方法来使用"在"之间" ; SQL运算符,如何获得预期结果?

1 个答案:

答案 0 :(得分:1)

我认为您希望将price表格放入如下所示的结构中:

| product_ref | price | startDate | endDate |

然后构建一个连接在该表上的查询,其中购买日期在价格日期范围之间:

SELECT
  pr.productName,
  SUM(d.quantity * p.price)
FROM
  details d
  INNER JOIN product pr ON d.product_ref = pr.ref
  INNER JOIN 
  (
    SELECT
      p.product_ref,
      p.price, 
      MIN(p.priceDate) AS StartDate,
      MIN(p1.priceDate) AS EndDate
    FROM price p
      LEFT JOIN price p1 ON p.product_ref = p1.product_ref
    WHERE
      p.priceDate < p1.priceDate
    GROUP BY p.product_ref, p.price
  ) p ON pr.ref = p.product_ref
  INNER JOIN recipts r ON r.numRecipt = d.recipts_numRecipt
WHERE
  r.dateOfPurchase >= p.startDate AND r.dateOfPurchase < p.endDate
GROUP BY pr.productName