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

Откуда:
Сообщений: 255
Здравствуйте, форумчане.
Хотел спросить, не понимаю что не правильно делаю:
Итак:
Есть файл в нём таблица, которая время от времени дополняется, в зависимости многих факторов. Таблица представляет из себя данные по некоторому инструменту, в зависимости от периода за конкретную дату,т.е.
date - valuta - instrument - t1 - t7 - t21 - t31 (где t1=1 день, t7 до 7 дней итд)
Всё бы было прекрасно, но а) Файл скачивается со сторонненого ресурса б) В таблице, нет сб,вс
Нужно получить итог, где, например есть 29.10.2013 затем идёт дата 02.12.2013, сб/вс нет, нужно их добавить исходя из того, что данные в сб/вс = пт(29.10.2013)итд, либо если будет пропущена среда(04.12.2013), то данные за среду должны быть равны данным за вторник(03.12.2013).
Делаю так:
select a.*,c.dt from RATES_FTP a
	join CALENDAR c on c.dt between '20121231' and @dtx
cross apply (select MAX(date_rate)dt from RATES_FTP where instrument=a.instrument and t_1=a.t_1 and t_7=a.t_7 and t_14=a.t_14 and t_21=a.t_21 and t_31=a.t_31 and date_rate<=c.dt) r
join RATES_FTP b on b.date_rate=r.dt and b.instrument=a.instrument and b.t_1=a.t_1 and b.t_7=a.t_7 and b.t_14=a.t_14 and b.t_21=a.t_21 and b.t_31=a.t_31

где @dtx входящий параметр в хранимой процедуре

Получается хрень
Можете помочь?
2 дек 13, 17:54    [15227357]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
o-o
Guest
denis_stell,
не знаю, кто что понял (я -- почти ничего), но если в календаре есть все даты, а в таблице они с пропусками,
то чтоб вывести все даты, начинайте с CALENDAR, к к-ому LEFT JOIN все остальное.
2 дек 13, 18:13    [15227478]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
Добрый Э - Эх
Guest
denis_stell,

есть подозрение, что тебе нужен coalesce.
но с твоих слов, без тестовых данных и желаемого результата на них - это чистой воды вангование кофейной гущей на хрустальном шаре
2 дек 13, 20:31    [15228170]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Добрый Э - Эх,

coalecse не подойдет скорей всего



Таблица RATES_FTP - возьмем промежуток с 04 по 10 ноября 2013, в этой таблице такие значения
2013-11-04;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-05;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-06;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-07;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-08;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
сб/вс отсутствует
Есть таблица CALENDAR, в которой есть все даты, нужно в итоге получить итоговую таблицу
2013-11-04;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-05;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-06;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-07;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-08;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-09;usd;ф.ставка;0.0001;0.005;0.1245;0.0002
2013-11-10;usd;ф.ставка;0.0001;0.005;0.1245;0.0002

необязательно то что нет данных в сб/вс, могут отсутствовать и данные по другим дням, если нет например данных в пятницу, то добавить нужно дату из календаря, а данные взять с четверга.
3 дек 13, 14:04    [15231861]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Меняться могут все данные, соответственно от даты до ставок, разные валюты,разные инструменты итд.
3 дек 13, 14:05    [15231872]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
kalakhary
Member

Откуда:
Сообщений: 17
create table #RATES_FTP (date datetime, val varchar(3), rate money)
insert into #RATES_FTP values ('20131104', 'usd', 1)
insert into #RATES_FTP values ('20131105', 'usd', 2)
insert into #RATES_FTP values ('20131106', 'usd', 3)
insert into #RATES_FTP values ('20131107', 'usd', 4)
insert into #RATES_FTP values ('20131108', 'usd', 5)
insert into #RATES_FTP values ('20131111', 'usd', 6)
insert into #RATES_FTP values ('20131112', 'usd', 7)
insert into #RATES_FTP values ('20131113', 'usd', 8)
insert into #RATES_FTP values ('20131114', 'usd', 9)
insert into #RATES_FTP values ('20131115', 'usd', 10)
;

with res (date_calendar, date, val, rate) as
(select  date_calendar, date, val, rate from calendar left join #RATES_FTP on date=date_calendar where date_calendar >='20131104' and date_calendar<='20131117')
select date_calendar, date, val, rate from res
where date is not null
union
select t1.date_calendar, t2.date, t2.val,t2.rate
from  res t1 , res t2
where t1.date is null and 
t2.date_calendar = (select max(date_calendar) from res where date is not null and date_calendar<=t1.date_calendar)

drop table #RATES_FTP 
4 дек 13, 10:25    [15237324]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
denis_stell
Member

Откуда:
Сообщений: 255
kalakhary,

Спасибо Вам огроменное
4 дек 13, 20:47    [15242065]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
Jaffar
Member

Откуда:
Сообщений: 633
select tt.IDInstr, c.Date, t.*
from t_Calendar c with(nolock)
cross join (select distinct IDInstr from @__TEMP) tt
outer apply(select top 1 t.*
			from @__TEMP t
			where
					t.IDInstr = tt.IDInstr
			and		t.Date <= c.Date
			order by t.Date desc /**/ ) t
where
		c.Date between @D1 and @D2
order by tt.IDInstr, c.Date
5 дек 13, 10:30    [15244066]     Ответить | Цитировать Сообщить модератору
 Re: запутался, помогите пожалуйста с запросом,что не так делаю  [new]
denis_stell
Member

Откуда:
Сообщений: 255
Jaffar,

спасибо, попробую Ваш вариант
6 дек 13, 10:32    [15251159]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить