Помогите с запросом

izoldov-roskini
Дата: 05.02.2013 12:46:44
Что-то переклинило совсем, есть таблица Товары {Код, Наименование},
есть таблица История цен {Код, Дата, Товар, Цена, Наценка}
Мне нужно получить одним запросом сводную таблицу, в которой будет Код, Наименование, Цена, Наценка
Таблица должна получаться на определенную дату. В таблице история цен данные выглядят так:
1,01.01.2013,10,5
1,01.05.2013,11,6
2,01.01.2013,12,8
и т.д.
Помогите допереть, вызов функций использовать не хочется
Добрый Э - Эх
Дата: 05.02.2013 12:50:23
банальный джойн двух таблиц, с последующей фильтрацией по дате и выборкой последней стоимости, у которой дата, не больше заданной. В чем именно сложности?
izoldov-roskini
Дата: 05.02.2013 13:00:30
Добрый Э - Эх
банальный джойн двух таблиц, с последующей фильтрацией по дате и выборкой последней стоимости, у которой дата, не больше заданной. В чем именно сложности?

Если бы все так просто было, не спрашивал бы, для каждого товара записей в истории несколько, причем если цена последняя на 04.01.2013 то на дату 10.01.2013 должна светиться она
Добрый Э - Эх
Дата: 05.02.2013 13:09:19
izoldov-roskini,

ещё раз:
1) Джойним таблицы как есть
2) Накладываем условие по дате ([История цен].[дата] <= <определенная дата>)
3) Делаем TOP 1 with ties с сортировкой по дате в обратном порядке.
4) Мыслим в сторону объединения условий соединения и фильтрации по дате (хотя, тут оптимизатор, скорее всего, сделает ЭТО лучше, чем ты)

Что именно сложно или не получается? Как пробовал?
aleks2
Дата: 05.02.2013 13:11:14
izoldov-roskini
Добрый Э - Эх
банальный джойн двух таблиц, с последующей фильтрацией по дате и выборкой последней стоимости, у которой дата, не больше заданной. В чем именно сложности?

Если бы все так просто было, не спрашивал бы, для каждого товара записей в истории несколько, причем если цена последняя на 04.01.2013 то на дату 10.01.2013 должна светиться она


1. О, блин, какие сложности!
2. Я те, страдалец, наставлю на путь истинный.
3. В таблице истории должна быть не дата, а ДВЕ: начало и кончало.
4. Кончало заполняешь запросом. Ну и обновляешь по необходимости или триггером.
5. Дальше - простой join.
6. Да, кончало последней цены заполняешь чем-нибудь перспективным, ну типо 6000г.
izoldov-roskini
Дата: 05.02.2013 13:13:52
Ken@t
Дата: 05.02.2013 13:14:37
izoldov-roskini
Добрый Э - Эх
банальный джойн двух таблиц, с последующей фильтрацией по дате и выборкой последней стоимости, у которой дата, не больше заданной. В чем именно сложности?

Если бы все так просто было, не спрашивал бы, для каждого товара записей в истории несколько, причем если цена последняя на 04.01.2013 то на дату 10.01.2013 должна светиться она

Где светиться ?

DECLARE @T TABLE (Id int , DateOfChange DATETIME, Amount DECIMAL(18,2) )


INSERT @T (Id, DateOfChange , Amount ) VALUES (  1,'20130101' , 1.0 ) 
INSERT @T (Id, DateOfChange , Amount ) VALUES (  1,'20130102' , 2.0 ) 
INSERT @T (Id, DateOfChange , Amount ) VALUES (  2,'20130101' , 3.0 ) 
INSERT @T (Id, DateOfChange , Amount ) VALUES (  2,'20130102' , 4.0 ) 


DECLARE @DATE DATETIME
SET @DATE = '20130102'

SELECT TOP 1 WITH TIES 
 Id
 ,DateOfChange 
 ,Amount 
FROM @T T
WHERE DateOfChange  <= @DATE
ORDER BY ROW_NUMBER() OVER (PARTITION BY Id ORDER BY DateOfChange DESC)


Это ?
aleks2
Дата: 05.02.2013 13:15:57
izoldov-roskini
Все красиво описано тут: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=9329&msg=36159

Дуракофф всегда привлекали фантики.
Добрый Э - Эх
Дата: 05.02.2013 13:16:33
izoldov-roskini
Все красиво описано тут: http://www.sql.ru/forum/actualutils.aspx?action=gotomsg&tid=9329&msg=36159
не очень красиво, но максимально подробно решение поставленной задачи рассматривается тут ;)