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

Откуда: Москва
Сообщений: 192
Вот такая задача. Есть накладная с товарами:

Товар PN QTY
Тонер aaa 7
При-р bbb 5



Нужно (хоелось бы) получить, т.е. разгруппировать одним запросом (т.е. не бегая в цикле) вот в такое, чтобы подготовить матрицу insert-ом для ввода потом серийников по конкретной позиции в накладной:

ТоварPNQTYNppSN
Тонер aaa 7 1 Null
Тонер aaa 7 2 Null
Тонер aaa 7 3 Null
Тонер aaa 7 4 Null
Тонер aaa 7 5 Null
Тонер aaa 7 6 Null
Тонер aaa 7 7 Null
При-р bbb 5 1 Null
При-р bbb 5 2 Null
При-р bbb 5 3 Null
При-р bbb 5 4 Null
При-р bbb 5 5 Null
24 янв 17, 15:35    [20140499]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
https://www.sql.ru/forum/1171323/razmnozhit-stroki
24 янв 17, 16:02    [20140678]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
OHO?
Guest
LightN,

with cte as 
(select 'toner' as a, 'aaa' as b, 7 as c
 union
select 'pr-r', 'bbb', 5)
,cte2 as (
select distinct number from master..spt_values where number between 1 and (select max(cte.c) from cte)
)
select a,b,c,number from cte
left join cte2 on   cte2.number<=cte.c

order by a,b,number
24 янв 17, 16:05    [20140701]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
Спасибо, но это как-то мудрено.
Вот сам додумался!!!
---
1. Создаем постоянную таблицу dbo.CN
2. В ней создали поле со счётчиком [Npp]
3. Вставили 2000 записей (можно и больше).
4. А далее запрос. Работает быстро, и главное то, что нужно:


SELECT        dbo.[Накл_Тов].Товар, dbo.[Накл_Тов].PN, dbo.[Накл_Тов].QTY, dbo.CN.Npp, Null as SN
FROM            dbo.CN INNER JOIN
                         dbo.[Накл_Тов] ON dbo.CN.Npp <= dbo.[Накл_Тов].QTY
ORDER BY dbo.[Накл_Тов].PN, dbo.CN.Npp


Результат:
Товар PN QTY Npp SN
Тонер aaa 7 1 Null
Тонер aaa 7 2 Null
Тонер aaa 7 3 Null
Тонер aaa 7 4 Null
Тонер aaa 7 5 Null
Тонер aaa 7 6 Null
Тонер aaa 7 7 Null
При-р bbb 5 1 Null
При-р bbb 5 2 Null
При-р bbb 5 3 Null
При-р bbb 5 4 Null
При-р bbb 5 5 Null
24 янв 17, 16:37    [20140897]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
LightN,

и только за неделю это второй вопрос " разгруппировать одним запросом"
24 янв 17, 16:40    [20140907]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
OHO?
LightN,

with cte as 
(select 'toner' as a, 'aaa' as b, 7 as c
 union
select 'pr-r', 'bbb', 5)
,cte2 as (
select distinct number from master..spt_values where number between 1 and (select max(cte.c) from cte)
)
select a,b,c,number from cte
left join cte2 on   cte2.number<=cte.c

order by a,b,number


Спасибо! Круто!
select distinct number from master..spt_values where number between 1 and (select 2000)

Даже таблицу со счетчиком создавать не нужно !!!
24 янв 17, 17:22    [20141097]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
invm
Member

Откуда: Москва
Сообщений: 9836
LightN
Даже таблицу со счетчиком создавать не нужно !!!
Нужно. Потому что пользоваться недокументированными возможностями для реальной работы чревато.

Ваша задача, кстати, одна из тех, где генерация последовательности чисел "на лету" эффективнее постоянной таблицы.
24 янв 17, 18:32    [20141419]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
invm
LightN
Даже таблицу со счетчиком создавать не нужно !!!
Нужно. Потому что пользоваться недокументированными возможностями для реальной работы чревато.
Ваша задача, кстати, одна из тех, где генерация последовательности чисел "на лету" эффективнее постоянной таблицы.
Согласен с "недокументированными возможностями". И кто его знает, как оно сработает в новой версии ...
Насчет эффективности. Я придерживаюсь правила, что если можно что-то сделать на JOIN, потом проверить на скорость с данными за целый год. Если получаешь 0 сек. на выполнение, то, думаю лучше так и оставить, а "генерация последовательности чисел "на лету"" для замены JOIN ... для реальной работы также чревато.
25 янв 17, 11:20    [20143410]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
LightN,

автор
, а "генерация последовательности чисел "на лету"" для замены JOIN
а как это?
25 янв 17, 11:25    [20143445]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31978
LightN
а "генерация последовательности чисел "на лету"" для замены JOIN ... для реальной работы также чревато.
Так об этом и речь - сделайте свою таблицу с числами (как вы сделали сразу), не пользуйтесь непонятно чем.
25 янв 17, 12:10    [20143758]     Ответить | Цитировать Сообщить модератору
 Re: Как разгруппировать таблицу в строки по 1-ой штуке?  [new]
LightN
Member

Откуда: Москва
Сообщений: 192
alexeyvg
LightN
а "генерация последовательности чисел "на лету"" для замены JOIN ... для реальной работы также чревато.
Так об этом и речь - сделайте свою таблицу с числами (как вы сделали сразу), не пользуйтесь непонятно чем.

Сделал. Не пользуюсь. Всё работает. Всем спасибо.
25 янв 17, 13:41    [20144297]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить