SQL-запрос для объединения нескольких таблиц для определения цены товара каждый день - PullRequest
0 голосов
/ 22 октября 2010

Я пытаюсь составить таблицу, показывающую цену товара каждый день в течение определенного периода времени.
Я начинаю с трех таблиц:

один содержит цену продажи с начальной и конечной датой, один содержит обычную цену предмета и когда он начался по этой цене, и одну таблицу дат, в которой только есть даты для заполнения пробелов.

Таблица:

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, я написал несколько запросов, чтобы попытаться объединить их, но они не работают правильно - и я не думаю, что я на правильном пути.

Может кто-нибудь помочь?

Ответы [ 2 ]

1 голос
/ 22 октября 2010

Первое, что вам нужно сделать, это упростить вашу схему.

Вам нужна только 1 таблица для информации о цене:

itemid, price, price_date_start, price_date_end, is_sale_price

С точки зрения приложения, не нужнобыть различием между ценами продажи и обычными ценами.Все цены имеют дату начала и дату окончания, хотя дата окончания текущей цены может быть неизвестна.Независимо от того, является ли цена продажной, важно только с точки зрения бизнеса, я добавила колонку, чтобы менеджмент был доволен.

На данный момент я должен отметить, что она не очень эффективна илиПолезно, чтобы база данных составляла список цен на каждую дату.База данных должна предоставлять вам только информацию об изменении цены, потому что цена остается постоянной между каждым изменением цены.

Если вам абсолютно необходимо получить базу данных для вывода значения для каждого дня, вы можете выполнитьчто, присоединившись к таблице, я описал последовательность или просмотр дат, как вы изначально планировали.Это относительно просто, но я не собираюсь публиковать решение из страха, что кто-то может его принять.

0 голосов
/ 22 октября 2010

Это значительно усложняется тем фактом, что таблица обычных цен имеет дату начала, но не дату окончания, хотя (я предполагаю), что обычная цена может меняться со временем.

Я предлагаю что-то вроде этого:

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
...