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

Откуда:
Сообщений: 20
Имеется таблица: товар, кол-во
подскажите, какой запрос можно к ней сделать, чтобы товар выводился столько раз, какое число стоит в кол-во?

например, исходник:
ручка, 3
карандаш, 2

нужно получить:
ручка
ручка
ручка
карандаш
карандаш
15 май 12, 13:26    [12556158]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
MaxOz, count() + group by
15 май 12, 13:29    [12556197]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
kDnZP
MaxOz, count() + group by

Тьфу ты... Протормозил, вам наоборот. Значит CROSS JOIN с таблицей чисел.
15 май 12, 13:30    [12556205]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
VSVLAD
Member

Откуда: Краснодар
Сообщений: 1398
Я примерно такое уже делал. Декларируем переменные, потом в цикле WHILE проходимся по всем записям, получаем в переменную колво. Потом во внутреннем цикле ещё раз проходимся от 1 до колво, и добавляем во временную таблицу/переменную нужные данные. Итого по окончании, получим таблицу с нужным колвом строк данных
15 май 12, 13:36    [12556260]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
MaxOz
Member

Откуда:
Сообщений: 20
kDnZP
CROSS JOIN с таблицей чисел.


А без привлечения дополнительных источников данных никак не обойтись?
Крайне не хочется создавать дополнительную таблицу с числами
15 май 12, 13:37    [12556288]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
Добрый Э - Эх
Guest
Динамически формируй таблицу при помощи рекурсивного CTE...
15 май 12, 13:40    [12556322]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
Добрый Э - Эх
Guest
Тынц: SQL2005: популярные задачи форума и CTE, Задача №2 - "Размножение" записей некоторой таблицы
15 май 12, 13:42    [12556345]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
Мистер Хенки
Member

Откуда: канализация
Сообщений: 6615
таблица с числами
declare @t table (sname varchar(50),cnt int)
insert into @t(sname,cnt)
		values('ручка',3)
			,('карандаш',2) 
;with 
  L0(c) as (select 0 from (values (0),(0),(0)) x(c)) --3 Rows
 ,L1(c) as (select 0 from L0 a, L0 b, L0 c)          --27 Rows (3x3x3)
 ,L2(c) as (select 0 from L1 a, L1 b, L1 c)          --19683 Rows (27x27x27)
 ,L3(c) as (select 0 from L2 a, L2 b)                --387,420,489 Rows (19683x19683)
 ,NN(n) as (select row_number() over (order by (select 0)) from L3)
,Numbers(number)as( 
select Number=isnull(convert(int,n),0)  
from NN 
where n<=1000000)

select
	t.sname
	,n.number
from	@t t
		inner join Numbers n
		on	n.number<=t.cnt
group by t.sname,n.number		
15 май 12, 13:54    [12556450]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
Добрый Э - Эх
Guest
with
--
-- Тестовый набор данных:
  t (name, cnt) as
    (
      select 'qwerty', 2
      union all 
      select 'qaz', 3
    ),
--
-- Основная часть запроса ("раздувание" данных):
  t_x (name, cnt, num) as
    (
      select name, cnt, 1
        from t
      union all
      select name, cnt, num + 1 
        from t_x 
       where num + 1 <= cnt
)
--
-- Вывод результата "раздувания в нужном виде":
select name, cnt
  from t_x
 order by name
15 май 12, 14:01    [12556491]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
kDnZP
Member [заблокирован]

Откуда: ★[msg=16399436]★[msg=20850760]
Сообщений: 11289
Мистер Хенки, так должно быть получшее:
;with 
 L0(c) as (select 0 from (values (0),(0),(0)) x(c)) --3 Rows
,L1(c) as (select 0 from L0 a, L0 b, L0 c)          --27 Rows (3x3x3)
,L2(c) as (select 0 from L1 a, L1 b, L1 c)          --19683 Rows (27x27x27)
,L3(c) as (select 0 from L2 a, L2 b)                --387,420,489 Rows (19683x19683)
,NN(n) as (select row_number() over (order by (select 0)) from L3)
,Numbers(number)as( 
	SELECT TOP  ( SELECT MAX(cnt) FROM @t)
			n
	FROM    NN
)
SELECT  t.sname
       ,n.number
FROM    @t t
        INNER JOIN Numbers n
        ON n.number <= t.cnt
GROUP BY t.sname
       ,n.number
15 май 12, 14:04    [12556516]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
MaxOz
Member

Откуда:
Сообщений: 20
Всем большое спасибо за участие!
15 май 12, 15:02    [12557248]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
MaxOz
kDnZP
CROSS JOIN с таблицей чисел.


А без привлечения дополнительных источников данных никак не обойтись?
Крайне не хочется создавать дополнительную таблицу с числами
Тем не менее именно это правильное решение (неприемлимо, только если система чужая и менять модель данных нельзя - но njulf можно использовать встроенную в сиквел таблицу с числами - spt_values).
15 май 12, 15:36    [12557593]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
MaxOz,

declare @tab table (val varchar(10))
declare @v varchar(100)
declare @n int
declare @i int
declare cur cursor for select * from tTest3
open cur
fetch next from cur into @v, @n
while @@fetch_status = 0
  begin
   set @i=@n
   print 'i=' + cast(@n as varchar(5))
   while @i>0
      begin
        insert into @tab values(@v)
        set @i=@i-1
      end
  fetch next from cur into @v, @n
  end

select * from @tab
close cur
deallocate cur 
15 май 12, 15:55    [12557840]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
is_me,
Вот это "реализация" достойна раздела как НЕ надо делать.
15 май 12, 16:29    [12558199]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
is_me
Member

Откуда: Нижний Новгород
Сообщений: 165
denis2710
is_me,
Вот это "реализация" достойна раздела как НЕ надо делать.


Как еще один вариант вполне сойдет.
Т.к. все варианты как "надо" делать уже приведены другими.
PS: а что в нем плохого? Тем более логика алгоритма самая прозрачная
для понимания из всех приведенных алгоритмов.
Самый прямолинейный алгоритм.
15 май 12, 16:38    [12558281]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31984
is_me
Как еще один вариант вполне сойдет.
Т.к. все варианты как "надо" делать уже приведены другими.
Ну, просто это самый плохой вариант из всех.


is_me
Тем более логика алгоритма самая прозрачная
для понимания из всех приведенных алгоритмов.
Самый прямолинейный алгоритм.
Самый прямолинейный вариант - он в одну строчку, с джойном к таблице чисел.
15 май 12, 16:43    [12558323]     Ответить | Цитировать Сообщить модератору
 Re: Вывод "раздутых" данных  [new]
denis2710
Member

Откуда: Москва
Сообщений: 3384
is_me,
is_me
а что в нем плохого?
А самому поискать в гугле,посмотреть,почитать религия запрещает?
В любой книжке по SQL любой автор пишет: не используйте курсоры,там где это возможно.
is_me
Тем более логика алгоритма самая прозрачная
для понимания из всех приведенных алгоритмов.
Самый прямолинейный алгоритм.

Ну наверно стоит все же начать читать литературу,что такое join,типы и как они работают.
З.Ы. ученье-свет,а не ученье-чуть свет и на работу.
15 май 12, 17:03    [12558516]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить