Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Размножить запись на несколько по количеству дней  [new]
Размножить запись
Guest
СУБД: MS SQL 2008 R2
Необходимо для каждой записи размножить её на несколько по количеству дней (DAYS), с прибавлением дня в дате для каждой последующей записи.

В Oracle я это делал через connect by, а как это сделать в MS SQL?
/* Oracle */
with
  t as
    (
      select 1 as ID, to_date('10.02.2011') as STARTDATE, 4 as DAYS from dual 
      union all  select 2, to_date('01.05.2011'), 2 from dual
      union all  select 3, to_date('15.01.2011'), 3 from dual
    )
select t.*, STARTDATE + level-1 as CURDATE, DAYS, level
  from t
connect by prior DAYS = DAYS
       and prior dbms_random.value is not null
       and level <= DAYS
17 апр 12, 16:36    [12428669]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
iljy
Member

Откуда:
Сообщений: 8711
Размножить запись,

with
  t as
    (
      select 1 as ID, convert(date, '10.02.2011', 105) as STARTDATE, 4 as DAYS
      union all  select 2, convert(date, '01.05.2011', 105), 2
      union all  select 3, convert(date, '15.01.2011', 105), 3
    )
select t.*, v.number
from t join master..spt_values v on v.number between 1 and t.DAYS
where type = 'P'

Вместо spt_values лучше создать свою таблицу чисел или представление.
17 апр 12, 16:43    [12428711]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31948
Размножить запись
В Oracle я это делал через connect by, а как это сделать в MS SQL?
Можно тоже циклом, как в оракле, но лучьше сделать таблицу-календарь или таблицу с числами.
17 апр 12, 17:29    [12429057]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Размножить запись
Guest
iljy
Размножить запись,

with
  t as
    (
      select 1 as ID, convert(date, '10.02.2011', 105) as STARTDATE, 4 as DAYS
      union all  select 2, convert(date, '01.05.2011', 105), 2
      union all  select 3, convert(date, '15.01.2011', 105), 3
    )
select t.*, v.number
from t join master..spt_values v on v.number between 1 and t.DAYS
where type = 'P'

Вместо spt_values лучше создать свою таблицу чисел или представление.

А чем лучше своя таблица, чем служебная spt_values?
18 апр 12, 21:49    [12436013]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Размножить запись
Guest
alexeyvg
Размножить запись
В Oracle я это делал через connect by, а как это сделать в MS SQL?
Можно тоже циклом, как в оракле, но лучьше сделать таблицу-календарь или таблицу с числами.

В смысле можно как в Oracle в таком стиле?
with t as (
select 1 as ID, to_date('10.02.2011', 'dd.mm.yyyy') as STARTDATE, 4 as DAYS from dual
union all  select 2, to_date('01.05.2011', 'dd.mm.yyyy'), 2 from dual
union all  select 3, to_date('15.01.2011', 'dd.mm.yyyy'), 3 from dual)
select id, sd
from t
model
partition by (id)
dimension by (0 d)
measures (startdate sd, days)
rules
(sd[for d from 0 to days[0] increment 1] = sd[0] + cv(d)
);

Можно кинуть ссылку на BOL, а то я что-то такого в MS SQL 2008 R2 не встречал?
18 апр 12, 21:51    [12436024]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
Размножить запись
А чем лучше своя таблица, чем служебная spt_values?

тем, что таблица spt_values:
1. недокументированная, а значит есть шанс, что её уберут в следующих редакциях
2. в контексте БД мастер, а на неё могут потребоваться отдельные права
3. имеет ограничение в 2 с небольшим тыс. записей, где type = 'P'
18 апр 12, 21:52    [12436039]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Размножить запись,

Ну вот пара вопросов:
1) Вы уверены, что эта таблица будет присутствовать в любой новой версии сиквела и называться также?
2) Вы уверены, что эта таблица сохранит структуру, значения и их количество?
3) Доступ к БД мастер есть и всегда будет у всех юзеров?
18 апр 12, 21:53    [12436043]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Knyazev Alexey,

гы =)
18 апр 12, 21:54    [12436045]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Knyazev Alexey
Member

Откуда: Екб -> Мск
Сообщений: 10233
Блог
SomewhereSomehow
Размножить запись,

Ну вот пара вопросов:
1) Вы уверены, что эта таблица будет присутствовать в любой новой версии сиквела и называться также?
2) Вы уверены, что эта таблица сохранит структуру, значения и их количество?
3) Доступ к БД мастер есть и всегда будет у всех юзеров?


вы оракал, ой...оракул?! мои мысли считали...
18 апр 12, 21:54    [12436048]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
SomewhereSomehow
Member

Откуда: Moscow
Сообщений: 2480
Блог
Knyazev Alexey,

Да сам в шоке =)))
18 апр 12, 21:55    [12436050]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Размножить запись
Guest
Knyazev Alexey, SomewhereSomehow, понял :)

А вот запросов с циклом в MS SQL не встречал.
19 апр 12, 02:05    [12436730]     Ответить | Цитировать Сообщить модератору
 Re: Размножить запись на несколько по количеству дней  [new]
Сон Веры Павловны
Member

Откуда:
Сообщений: 6201
Размножить запись
А вот запросов с циклом в MS SQL не встречал.

Встречайте: https://www.sql.ru/forum/actualthread.aspx?bid=1&tid=316343
19 апр 12, 03:26    [12436759]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить