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

Откуда:
Сообщений: 48
День добрый!
Есть задачка, на первый взгляд простая. Не могу решить.

Табличка, в которой содержится много строк типа: ID товара (Item_id), количество (Qty), сумма за все кол-во товара (Total_sum).
Надо в одном запросе типа select вывести строки одинакового содержимого в количестве равном qty.
Т.е. число строк в результирующем запросе на каждую строку источника должно быть равно qty.
Например, как-то так
Источник
Item_id Qty Total_sum
1 2 12
1 3 9

Результат
Item_id Qty Total_sum
1 2 12
1 2 12
1 3 9
1 3 9
1 3 9
13 фев 14, 08:38    [15560474]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
aleks2
Guest
Заведите себе табличку с Натуральными числами.
13 фев 14, 08:41    [15560484]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
aleks2,

Еще раз уточню, задача стоит - вывести одним запросом, без дополнительных табличек, процедур, функций и других объектов БиДэ.
И суммы могут быть не целым числом.
13 фев 14, 08:53    [15560518]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
aleks2
Guest
JustNick
aleks2,

Еще раз уточню, задача стоит - вывести одним запросом, без дополнительных табличек, процедур, функций и других объектов БиДэ.
И суммы могут быть не целым числом.


Мало ли какой идиот ставил тебе задачу.
Вот ты ему и объясни, что так правильнее.

ЗЫ. Но если ты склонен к соглашательству - тут были решения по генерации таблиц натуральных чисел "на лету".
Тот же рекурсивный CTE.
13 фев 14, 09:08    [15560572]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
СТЕ не сработал. Либо я что-то не так делаю, либо это не вариант решения данной задачи.

PS. Не настолько знаю, идиот ли тот, кто задачу ставил, а равно и вы. Посему есть у меня к вам, aleks2, просьба: вы не могли бы сюда в тему больше ничего не писать? Со всем уважением к вашим талантам и 7 пядям во лбу.
13 фев 14, 09:17    [15560607]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
StarikNavy
Member

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

так вам слона не продать (С)
советчиков гоните, скрипты и свои варианты не предоставляете
13 фев 14, 09:28    [15560665]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
StarikNavy
JustNick,

так вам слона не продать (С)
советчиков гоните, скрипты и свои варианты не предоставляете
Не просто гонит, а обзывает идиотами.
Простейшую задачку решить не может.
Лучше бы уроки шёл делать.
13 фев 14, 09:30    [15560674]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
JustNick
Еще раз уточню, задача стоит - вывести одним запросом, без дополнительных табличек, процедур, функций и других объектов БиДэ.
Тогда единственный вариант - создавать такую табличку каждый раз в запросе (например, используя CTE)
Так что определение коллеги aleks2 вполне обоснованно.
JustNick
СТЕ не сработал. Либо я что-то не так делаю, либо это не вариант решения данной задачи.
Что то не так делаете. Покажите ваш вариант.
13 фев 14, 09:32    [15560686]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
Всем спасибо за участие!
Итог: все получилось сделать таки через СТЕ. Видимо предыдущие попытки все же были неправильные, но код уже не сохранен, не могу на суд толпы предоставить :)

Если кому-то интересно или есть замечания, то сейчас код такой:
with tbl1_ (item_id, total_sum, qty) as
(
	select s.item_id, s.total_sum, s.qty
	from tbl1 s
	where s.item_id = 1
	group by s.item_id, s.total_sum, s.qty
)
select i.item_id, i.total_sum, i.qty
from tbl1 i
inner join tbl1_
	on i.item_id = tbl1_.item_id
	and i.item_id = 1
	and i.qty + 1 >= tbl1_.qty
order by i.qty


Скрины таблицы и результата прилагаю.
Таблица
Результат

К сообщению приложен файл. Размер - 5Kb
13 фев 14, 10:04    [15560837]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
vvv4
Guest
declare @t table(id int, qty int, tot int)

insert into @t(id, qty,tot)
values(1,2,120),
(2,5,150),
(3,3,130)

select t.* from @t t
cross apply
(
select number from master.dbo.spt_values
where type='P' and number < t.qty
) p
13 фев 14, 10:04    [15560839]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
Мой код по сравнению с кодом vvv4, где используется табличка master.dbo.spt_values, работает криво.
Кто-нибудь может объяснить, почему в конструкции рекурсии СТЕ съедаются иногда строки, в частности все последние строки?
13 фев 14, 11:10    [15561317]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
Glory
Member

Откуда:
Сообщений: 104751
JustNick
почему в конструкции рекурсии СТЕ съедаются иногда строки, в частности все последние строки?

Потому что ваш CTE не генерирует последовательность целых чисел
И еще он ни разу не рекурсивный

Сообщение было отредактировано: 13 фев 14, 11:13
13 фев 14, 11:13    [15561352]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
Glory,

а пример ошибок или правильного кода привести можете?
13 фев 14, 11:42    [15561653]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
JustNick
Кто-нибудь может объяснить, почему в конструкции рекурсии СТЕ съедаются иногда строки, в частности все последние строки?
Вы в СТЕ должны сделать набор натуральных чисел (раз вы не хотите использовать готовый набор чисел из своей таблицы или из существующей таблицы master.dbo.spt_values), от 1 до максимального qty, а потом джойнить вашу таблицу с этим набором, с условием number < t.qty.
Или не джойнить, а использовать cross apply, как сделал vvv4, хотя ИМХО так менее наглядно.
13 фев 14, 11:42    [15561657]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
JustNick
пример ошибок или правильного кода привести можете?
Да у вас просто совсем не то в CTE написано, зачем там упоминается ваша таблица???

Можно было в этом форуме найти по словам "CTE последовательные числа"
Например:
WITH Numbers(N) AS(SELECT 1 UNION ALL SELECT N+1 FROM Numbers WHERE N<1000) SELECT N FROM CTE
13 фев 14, 11:45    [15561676]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
alexeyvg
Member

Откуда: Moscow
Сообщений: 31986
alexeyvg
Можно было в этом форуме найти по словам "CTE последовательные числа"
Например:
WITH Numbers(N) AS(SELECT 1 UNION ALL SELECT N+1 FROM Numbers WHERE N<1000) SELECT N FROM CTE
То есть так правильно:
;WITH Numbers(N) AS(SELECT 1 UNION ALL SELECT N+1 FROM Numbers WHERE N<1000) SELECT N FROM Numbers OPTION(MAXRECURSION 0);
13 фев 14, 11:48    [15561701]     Ответить | Цитировать Сообщить модератору
 Re: Вывод заданного количества одинаковых строк  [new]
JustNick
Member

Откуда:
Сообщений: 48
alexeyvg,

Спасибо большое
13 фев 14, 11:56    [15561771]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить