Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 помогите составить запрос...  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
Добрый день гуру!
есть 2 таблицы:
t1 (id bigint, naimen nvarchar(50))
t2 (dt datetime,t1_id bigint, cena decimal(18,2))

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

23.02.2000 1 23.33
26.02.2000 1 62.02
06.03.2000 1 70.23

необходимо создать запрос с параметрами id и dt который бы выбрал нужную цену на заданную дату например:

dt = 27.02.2000 id=1
получаем:
1 'какато хрень' 27.02.2000 62.02

чуйствую что это простенько решается - но доехать никак не могу... помогите кто чем может...

спасибо.
3 апр 12, 10:55    [12355452]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос...  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
Ъыжсло,
что-то в этом духе
+

declare @t1 table
  (
    id bigint
  , naimen nvarchar(50)
  )
declare @t2 table
  (
    dt datetime
  , t1_id bigint
  , cena decimal(18, 2)
  )
insert  into @t1
        ( id, naimen )
values  ( 1, 'какая-та хрень' )
,       ( 2, 'какая-та хрень 1 ' )

insert  into @t2
        ( dt, t1_id, cena )
values  ( '20120102', 1, 100 )
,       ( '20120103', 1, 101 )
,       ( '20120104', 1, 102 )
,       ( '20120104', 2, 112 )
,       ( '20120103', 2, 111 )
,       ( '20120101', 2, 110 )

select  *
from    @t1 a
outer apply ( select top ( 1 )
                      dt
                    , cena
              from    @t2 b
              where   a.id = b.t1_id
              order by b.dt desc
            ) x

3 апр 12, 11:03    [12355504]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос...  [new]
походя
Guest
Ъыжсло,


select top 1 * from t2 where dt <= 27.02.2000 and  t1_id =1
order by dt desc

?
По всем
select top 1 with ties * from t2 where dt <= 27.02.2000 and  t1_id =1
order by rank() over(partition by t1_id  order by dt desc)
3 апр 12, 11:06    [12355529]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос...  [new]
походя
Guest
походя,

Сорри во втором варианте вот так
select top 1 with ties * from t2 where dt <= 27.02.2000 
order by rank() over(partition by t1_id  order by dt desc)
3 апр 12, 11:07    [12355533]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос...  [new]
Ъыжсло
Member

Откуда:
Сообщений: 32
бесконечное спасибо ))
но вот какая штука.... программа работает с разными базами и как поведет себя такой хитрый запросец например на MSSQL2000 FoxPro MSAccess MySQL Interbase XML??? не рассыпется?
3 апр 12, 11:29    [12355658]     Ответить | Цитировать Сообщить модератору
 Re: помогите составить запрос...  [new]
invm
Member

Откуда: Москва
Сообщений: 9838
Ъыжсло
бесконечное спасибо ))
но вот какая штука.... программа работает с разными базами и как поведет себя такой хитрый запросец например на MSSQL2000 FoxPro MSAccess MySQL Interbase XML??? не рассыпется?
Для 2000, MySQL, Interbase
select
 t.* 
from
 t2 t
where
 t.id = 1 and
 t.dt <= '20000227' and
 not exists(select * from t2 where id = t.id and dt > t.dt)
Для прочих недоСУБД со своими собственными диалектами SQL, спрашивайте в профильных форумах.
3 апр 12, 11:42    [12355745]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить