Я пытаюсь сделать SQL-запрос, чтобы найти продукт, который поднял наименьшую сумму денег, но у меня возникла проблема, и это то, что у меня есть таблица, которая отслеживает разные даты для цен, например Product 1 имеет цену 5000 для всех рецептов, купленных в период между 2011-01-01 и следующей датой изменения цены, и это 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. Как я могу получить ожидаемый результат?
Я думаю, вы бы хотели, чтобы ваш 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