Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Размножить строки  [new]
qwerdfghvbn
Guest
Добрый день! Коллеги, пожалуйста помогите с запросом
if object_id('tempdb..#t') is not null
 drop table #t;
create table #t
( id int identity(1, 1) not null primary key clustered
, num1 int
, num2 int
);

insert into #t(num1, num2)
select 1, 3 union all
select 2, 6 union all
select 4, 4 union all
select 3, 7 union all
select null, 5 union all
select 3, null

select id, num1, num2, row_number() over (partition by id order by id) from #t

Надо размножить строки таблицы #t. Множитель для каждой строки определяется как num2 - num1 null != 0

Должно быть что-то типа такого:
idnum1num2RowNum
1131
1132
2261
2262
2263
4371
4372
4373
4374
18 авг 15, 14:22    [18034069]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
qwerdfghvbn,

JOIN с таблицей чисел.

А что такое null != 0 ??
18 авг 15, 14:25    [18034092]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
qwerdfghvbn
Guest
Прошу прощения, поиском ищется "на раз"
Слова для поиска:
Размножить, Продублировать
18 авг 15, 14:25    [18034094]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
Размножить строки qwerdfghvbn
Guest
iap, спасибо большое за внимание!
Сначала написал, потом полез в поиск - все просто, что-то затупил.

А что такое null != 0 ??
Тут имелось в виду, что null и ноль - это разные вещи (просто уточнил)
18 авг 15, 14:26    [18034110]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
iap
Member

Откуда: Москва
Сообщений: 47085
Размножить строки qwerdfghvbn
iap, спасибо большое за внимание!
Сначала написал, потом полез в поиск - все просто, что-то затупил.

А что такое null != 0 ??
Тут имелось в виду, что null и ноль - это разные вещи (просто уточнил)
А бывают случаи, когда они равны?
С другой стороны, что означает NULL для размножения в таком случае?
18 авг 15, 14:32    [18034162]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
a_voronin
Member

Откуда: Москва
Сообщений: 4832
iap
А бывают случаи, когда они равны?


Бывают -- например в OLAP кубах 0 == NULL
18 авг 15, 14:52    [18034328]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
if object_id('tempdb..#t') is not null
 drop table #t;
create table #t
( id int identity(1, 1) not null primary key clustered
, num1 int
, num2 int
);

insert into #t(num1, num2)
select 1, 3 union all
select 2, 6 union all
select 4, 4 union all
select 3, 7 union all
select null, 5 union all
select 3, null

select id, num1, num2, row_number() over (partition by id order by id) from #t


;with cte (main_id, id)
as (
    select id as main_id,
           isnull(num1, 0) as id
      from #t
      union all
    select x.main_id as main_id,
           x.id + 1 as id
    from cte x
    where x.id < (select isnull(x2.num2, 0) from #t x2 where x2.id = x.main_id)
    )
    select c.main_id as id, c.id as num1, isnull(t.num2, 0) as num2 from cte c join #t t on t.id = c.main_id order by id


вариант с cte, хотя легче через джоин таблицы :)
18 авг 15, 14:53    [18034335]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
qwerdfghvbn
Guest
iap
А бывают случаи, когда они равны?

В рамках троичной логики - нет. Но практика показывает, что у многих они оказываются равны :)
В целом, этим я пытался сказать, чтобы те, кто захочет помочь не рассматривали null как ноль, не более чем. Слишком кратко написал, лучше бы вообще не указывал.
iap
С другой стороны, что означает NULL для размножения в таком случае?

null значение в условиях размножения должно рассматриваться как и положено - как пустое значение.т И арифметические операции также должны выполняться по правилам сравнения с null.
Когда я писал тестовый набор, я по привычке накидал null значений в оба столбца. Ещё не добавил других вариантов, где, например, разница была бы отрицательной. В практической задаче поля не могут быть Null, есть логические проверки. Но это не суть важно. Можно сказать что тестовый пример я написал неудачно для этого поста (да и вообще не очень удачно ) )
18 авг 15, 14:57    [18034357]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
упс. недосмотрел результирующий набор

;with cte (main_id, id)
as (
    select id as main_id,
           isnull(num1, 0) as id
      from #t
      union all
    select x.main_id as main_id,
           x.id + 1 as id
    from cte x
    where x.id < (select isnull(x2.num2, 0) from #t x2 where x2.id = x.main_id)
    )
    select c.main_id as id,
           isnull(t.num1, 0) as num1, --c.id as num1,
		 isnull(t.num2, 0) as num2,
		 row_number() over (partition by main_id order by main_id) as row_id    
    from cte c join #t t on t.id = c.main_id order by id
18 авг 15, 14:57    [18034368]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
qwerdfghvbn
Guest
felix_ff, спасибо. Рекурсивно размножать строки очень не хотел - и небыстро и читать неудобно. Тот код, в котором это будет не стоит таких упражнений )
18 авг 15, 14:59    [18034382]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
felix_ff
Member

Откуда: Moscow
Сообщений: 1757
qwerdfghvbn,

ну тогда ответ вам уже дали) я привел просто как еще один вариант)
+
не самый оптимальный
18 авг 15, 15:01    [18034396]     Ответить | Цитировать Сообщить модератору
 Re: Размножить строки  [new]
o-o
Guest
declare @t table 
( id int identity(1, 1) not null primary key clustered
, num1 int
, num2 int
);

insert into @t(num1, num2)
select 1, 3 union all
select 2, 6 union all
select 4, 4 union all
select 3, 7 union all
select null, 5 union all
select 3, null;

select *
from @t
cross apply (select n from dbo.Nums
             where n <= num2 - num1)a


К сообщению приложен файл. Размер - 43Kb
18 авг 15, 15:17    [18034516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить