我试图通过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运算符,如何获得预期结果?
答案 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