Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];

Вниз

Как составить SQL запрос   Найти похожие ветки 

 
AndrewK   (2002-01-29 09:16) [0]

Добрый день!

Есть две таблицы:

Products Prices

Code int IDR +
Name varchar(50) Product_ID int
Weight float ActualDate datetime
Capacity float Cost float

Поле Prices.Product_ID -> Products.Code

Таблица Prices содержит информацию о динамике цен. Поле ActualDate указывает дату с которой меняется цена на изделие с кодом Product_ID.

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

Например: Надо узнать цены на изделия на 29.01.2002

Name Cost ActualDate

Изделие 1 10 10.12.2001
Изделие 2 15 28.01.2002
Изделие 3 20 10.12.2001
Изделие 4 2 10.12.2001
Изделие 5 100 29.01.2002

В поле ActualDate выбирается дата, которая максимальная из меньших или равных заданной контрольной точке, здесь 29.01.2002.

Заранее благодарен.


 
Gregory   (2002-01-29 09:40) [1]

@p_date - Дата, на которую надо выдать цены

SELECT Name, Cost, ActualDate
FROM Products
INNER JOIN Prices t1 ON t1.Product_ID = Code
WHERE NOT( EXISTS ( SELECT 1
FROM Prices t2
WHERE t2.Product_ID = Code
AND t2.ActualDate > t1.ActualDate
AND t1.ActualDate <= @p_date )
AND t1.ActualDate <= @p_date

Это запрос не выдаст в списке товар у которого на указанную дату цена отсутствует. Если надо выдавать, но с NULL-ценой, то можно заменить на.

SELECT Name, Cost, ActualDate
FROM Products
LEFT OUTER JOIN Prices t1 ON t1.Product_ID = Code
WHERE NOT( EXISTS ( SELECT 1
FROM Prices t2
WHERE t2.Product_ID = Code
AND t2.ActualDate > t1.ActualDate
AND t1.ActualDate <= @p_date )
AND ( t1.ActualDate <= @p_date OR
t1.ActualDate IS NULL )


 
amamed_3071   (2002-01-29 10:24) [2]

Select P.CODE,P.NAME,PRICE.ACTUALDATE,PRICE.COST from Products P
left outer join
(SELECT Product_ID,COST, ActualDate FROM PRICES PR
INNER JOIN
(Select Product_ID,MAX(ActualDate) MD FROM PRICES P
WHERE ActualDate<=@DATE GROUP BY Product_ID) PRMAX
ON PRMAX.MD=PR.ActualDate AND PR.Product_ID=PRMAX.Product_ID
WHERE PR.ActualDate<=@DATE
) PRICE ON P.CODE=PRICE.Product_ID

...ORDER BY...


 
SergSuper   (2002-01-29 11:22) [3]

Как то всё сложно, по-моему так проще
select Name, Cost, ActualDate
from Products o, Prices i
where i.Product_ID = o.Code
and i.ActualDate=(select max(ActualDate) from Prices i2 where i2.Product_ID = o.Code and i2.ActualDate<=@date)
но такой запрос может работать медленно(при больших объёмах данных)
Для ускорения можно сначала выбрать нужные даты по товарам во временную таблицу и потом уже выбирать цены с её помощью. Так мы уйдём от вложенных запросов. Но всё равно не очень быстро.
Можно еще упростить запрос если несколько усложнить структуру таблицы цен - добавить поле с датой следующей цены. Для последней даты будет ставиться заведомо большая дата. Т.е. примерно так:

Name Cost ActualDate NextDate

Изделие 1 10 10.12.2001 31.10.2065
Изделие 2 15 01.01.2002 28.01.2002
Изделие 2 16 28.01.2002 31.10.2065
Изделие 3 20 10.12.2001 31.10.2065

Тогда запрос еще упрощается и соответственно увеличивается скороть выполнения:
select Name, Cost, ActualDate
from Products o, Prices i
where i.Product_ID = o.Code
and i.ActualDate<=@date and i.NextDate>=@date
Но усложняется ведение таблицы цен - за всё надо платить.


 
AndrewK   (2002-01-29 13:02) [4]

Огромное спасибо всем



Страницы: 1 вся ветка

Форум: "Базы";
Текущий архив: 2002.02.21;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.46 MB
Время: 0.004 c
1-66541
UnDISCOvery
2002-02-04 16:58
2002.02.21
Как отследить и обработать событие на перемещение окна ?


1-66574
panov
2002-02-04 15:28
2002.02.21
Экспорт класса в DLL


1-66549
MVova
2002-02-05 10:56
2002.02.21
Управление большим количеством проэктов.


4-66712
SkyR
2001-12-24 01:29
2002.02.21
Такая проблема с Edit - полем...


1-66518
nick_vstu
2002-02-05 03:15
2002.02.21
Глюки LMD





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский