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

data ost
01/05/2011 100
05/05/2011 80
08/05/2011 120
12/05/2011 200

...и тд

Нужно сделать следующее:
data ost
01/05/2011 100
02/05/2011 100
03/05/2011 100
04/05/2011 100
05/05/2011 80
06/05/2011 80
07/05/2011 80
08/05/2011 120
09/05/2011 120
10/05/2011 120
11/05/2011 120
12/05/2011 200

...и тд


Решение в "лоб" вроде есть, а вот как сделать его универсальным, чтобы каждый интервал был задействован в запросе (для каждого интервала), а не только от '01/05/2011' до '04/05/2011'?

select dateadd(day,num,'01/05/2011') from
(select a*1000+b*100+c*10+d num from
(select 0 a union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) a
cross join
(select 0 b union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) b
cross join
(select 0 c union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) c
cross join
(select 0 d union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) d
) a where dateadd(day,num,'01/05/2011')<='04/05/2011' order by 1

Спасибо за помощь! ))
2 сен 11, 14:47    [11218690]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Eshka, а что мешает вместо констант вписать подзапросы возвращающие минимальную и максимальную даты из таблицы Остатки?
2 сен 11, 15:02    [11218884]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
Eshka
Guest
kDnZP,

Я так и сделала ))

Только вот другой вопрос возник...Как мне теперь заполнить столбец SALDO (вместо "0" значения соответствующие вставить, то есть 100, 80 и т.д. - выше показано как надо), то есть следующий код выводит таблицу таким образом

DATE SALDO
01/05/2011 100
02/05/2011 0
03/05/2011 0
04/05/2011 0
05/05/2011 80
06/05/2011 0
07/05/2011 0
08/05/2011 200
09/05/2011 0
10/05/2011 0
11/05/2011 0
12/05/2011 50

и т.д.


select dateadd(day,num,(select min(dateT) from tab1)) as DATE,
isnull((select saldo from tab1 a where dateT=dateadd(day,num,(select min(dateT) from tab1))),0)as SALDO
from
(select a*1000+b*100+c*10+d num from
(select 0 a union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) a
cross join
(select 0 b union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) b
cross join
(select 0 c union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) c
cross join
(select 0 d union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) d
) a where dateadd(day,num,(select min(dateT) from tab1 ))<=(select max(dateT) from tab1 ) order by 1

Понимаю, что в выражении

isnull((select saldo from tab1 a where dateT=dateadd(day,num,(select min(dateT) from tab1))),0)as SALDO

там где "0" нужно выражение, чтобы доставались именно соответствующее датам значения...Не получается что-то...Есть задумки?
2 сен 11, 17:53    [11220358]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
HandKot
Member

Откуда: Sergiev Posad
Сообщений: 3058
select dateadd(day,num,(select min(dateT) from tab1)) as DATE, 
isnull((select TOP 1 saldo from tab1 a where dateT<=dateadd(day,num,(select min(dateT) from tab1)) ORDER BY dateT DESC),0)as SALDO 
from
(select a*1000+b*100+c*10+d num from
(select 0 a union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) a
cross join 
(select 0 b union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) b
cross join 
(select 0 c union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) c
cross join 
(select 0 d union select 1 union select 2 union select 3 union select 4
union select 5 union select 6 union select 7 union select 8 union select 9) d
) a where dateadd(day,num,(select min(dateT) from tab1 ))<=(select max(dateT) from tab1 ) order by 1
2 сен 11, 18:37    [11220534]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
кал енд а рь
Guest
Eshka,

заведите себе таблицу "календарь" и не мучайтесь.

в нее нужно вставить все даты за много-много лет и потом на нее джойниться.
2 сен 11, 18:41    [11220552]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
Eshka
Guest
HandKot,

Спасибо большое! Работает! ))
2 сен 11, 18:41    [11220553]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
alexejs
Member

Откуда:
Сообщений: 147
http://blogs.technet.com/b/isv_team/archive/2011/08/18/3447784.aspx
2 сен 11, 18:42    [11220556]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
Eshka
Guest
кал енд а рь,

Не, с таблицами заморочки лишние и по времени дольше, чем запрос. Все уже работает! Спасибо!
2 сен 11, 18:44    [11220561]     Ответить | Цитировать Сообщить модератору
 Re: SQL-запрос: Восстановить даты и значение остатка этих дат  [new]
zhiv
Member

Откуда:
Сообщений: 1
DECLARE @maxdate datetime = (select max(data) from sklad);

with DateCTE (data)
AS
(
  select min(data) from sklad
  union all
  select DATEADD(day,1,data) from DateCTE
  where data<@maxdate
)

select 
  D.data,
  (select s.ost from sklad as s
   where s.data = (select MAX(data) from sklad where sklad.data<=D.data)) as ost 
from DateCTE AS D
OPTION (MAXRECURSION 32767)
2 сен 11, 22:39    [11221609]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить