Дублировать записи в запросе

redsky
Дата: 25.02.2010 17:25:49
Доброго всем дня.

Есть таблица
предметпоказательколичество
ложка4563
чашка3842
тарелка2954

Каким запросом можно получить таблицу вида:
предметпоказатель
ложка456
ложка456
ложка456
чашка384
чашка384
тарелка295
тарелка295
тарелка295
тарелка295

т.е. каждый предмет продублировался ровно столько раз, сколько для него записано в столбце количество.
Может кто знает, как это сделать ?
alexeyvg
Дата: 25.02.2010 17:32:15
redsky
т.е. каждый предмет продублировался ровно столько раз, сколько для него записано в столбце количество.
Может кто знает, как это сделать ?
Сделать таблицу с цифрами и джойнить её по условию количество < количество
Le Peace
Дата: 25.02.2010 17:35:46
create table q(q int, w int)
insert into q
select 1, 3 union all
select 2, 5 union all
select 3, 10
select q.*
from q
join (select * from master..spt_values where type = 'P') v
   on v.number < q.w
redsky
Дата: 25.02.2010 18:56:34
Le Peace
create table q(q int, w int)
insert into q
select 1, 3 union all
select 2, 5 union all
select 3, 10
select q.*
from q
join (select * from master..spt_values where type = 'P') v
   on v.number < q.w

Большое СПАСИБО !!!
stimpi
Дата: 25.02.2010 19:12:13
учтите что
master..spt_values 
пройдет только до 256 значений, дальше надо таблицу чисел подключать
msLex
Дата: 25.02.2010 19:19:47
stimpi
учтите что
master..spt_values 
пройдет только до 256 значений, дальше надо таблицу чисел подключать


или кроссджойнить табличку master..spt_values саму на себя.
Le Peace
Дата: 25.02.2010 19:45:56
Да вообще-то лучше сразу табличку чисел подключить, это я как пример привёл. Или через CTE делать.
iap
Дата: 25.02.2010 21:24:30
stimpi
учтите что
master..spt_values 
пройдет только до 256 значений, дальше надо таблицу чисел подключать
Для SQL2005 - 2048 значений!
iap
Дата: 25.02.2010 22:05:35
iap
stimpi
учтите что
master..spt_values 
пройдет только до 256 значений, дальше надо таблицу чисел подключать
Для SQL2005 - 2048 значений!
Хотя, в SQL2005 можно просто пронумеровать все записи большой таблицы
функцией ROW_NUMBER()OVER(ORDER BY(SELECT 0)), - и вот у нас уже намного больше номеров, чем 2048!
mike909
Дата: 26.02.2010 10:35:59
redsky,

Для SQL2k5(8)
declare @t table( [предмет] nvarchar(50), [показатель] int, [количество] int ) 

insert into @t
select 'ложка', 456 , 3 union all
select 'чашка', 384, 2 union all
select 'тарелка', 295, 4 

;with L0 as (select 0 as N union all select 0),
      L1 as (select 0 as N from L0 as t1 cross join L0 as t2),
      L2 as (select 0 as N from L1 as t1 cross join L1 as t2),
      L3 as (select 0 as N from L2 as t1 cross join L2 as t2),
      L4 as (select 0 as N from L3 as t1 cross join L3 as t2),
      L5 as (select row_number() over(order by t1.N) as [N] from L4 as t1 cross join L4 as t2)
select t.[предмет], t.[показатель]--,C.N as [номер по порядку] 
from @t as t
cross apply(
  select top(t.[количество]) N
  from L5
) as c