Как запросить исторические цены там, где нет ни начальных, ни конечных дат?

0

Я пытаюсь сделать 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. Как я могу получить ожидаемый результат?

  • 0
    Вы используете MySQL или Postgresql?
  • 0
    Либо Mysql для скрипки и postres для моего реального примера
Теги:

1 ответ

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
  • 0
    Я попробовал ваш запрос, и единственное правильное значение, которое я получаю, - это сумма для мороженого, равная 4400, другие значения, которые я получаю, неверны, за все время в получателе 4 был куплен только один торт 4 в 2014-05-01 с ценой 4400, и запрос возвращает общее количество для торта 6500. Когда я изменяю <for <=, я получаю правильное значение для тортов, но больше не для мороженого или других продуктов
  • 1
    Я сделал обновление для запроса, попробуйте сейчас. Вы должны быть в состоянии сделать некоторые настройки по своему вкусу.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню