powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача списка в лист
12 сообщений из 12, страница 1 из 1
Передача списка в лист
    #40122795
BBS_BOSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Доброго времени суток!

Задача:
Нужно сгенерировать от 30 до 40 заказов для каждого агента (15 шт)
В генерацией записей проблем нет, но как перебрать всю таблицу агентов и для каждого создать 30-40 заказов?
(Количество заказов для каждого агента должно варьироваться в диапазоне от 30
до 40 и определяться случайным значением)


Была идея создания списка Agents.Id и просто в запрос вставлять поочереди, не смог ничего внятного найти по созданию и перебора списка, возможно просто как дурак смотрю в экран ничего не вижу.

В процессе написания статьи пришла идея :
- Узнать сколько всего агентов и записать в переменную set @number_agents = select count(*) from Agents;
- Создать строковую переменную, которая хранит уже использованные Id
- Создать цикл while проверяющий больше ли нуля @number_agents и в цикле просто уменьшать это значение
- В теле цикла делать запрос на получение одного Agents.Id, которые нет в переменной.

Если лучшие идеи решение данного вопроса и как вам идеи предложенные мною?
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122804
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BBS_BOSS
Если лучшие идеи решение данного вопроса и как вам идеи предложенные мною?
Идеи не поддерживаю.
Лучше одним простым запросом:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
select *
from agents o
cross apply (
    select top 30 *
    from orders o
    where o.agentid = a.id
) z
order by a.id, o.id
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122809
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
BBS_BOSS
Если лучшие идеи решение данного вопроса и как вам идеи предложенные мною?
Идеи не поддерживаю.
Лучше одним простым запросом:
Тьфу, создать, а не получить.
Тогда одной командой insert для каждой из таблиц Orders и т.д.

Идея примерно такая:
Код: sql
1.
2.
3.
4.
5.
6.
7.
--insert Orders
select ...
from Agents a
    join (
        select ..., row_number() over(order by c.id) as n
        from syscolumns c
    ) o on o.n <= 30


Вместо "30" нужно генератор случайных чисел, что бы выдавал диапазон 30-40.
К сожалению, в запросах rand() не работает, но можно сделать view на её основе, и использовать в этом запросе, погуглите.
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122811
BBS_BOSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
alexeyvg, Спасибо за ваше решение, но что же выйдет в итоге?
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122818
Фотография court
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
имхо ТС курсор "ищет" )

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
declare с cursor read_only
for
  select AgentID from agents  -- как перебрать всю таблицу агентов

open c
while 1=1
begin
	fetch next from c into @AgentID 
	if @@fetch_status < 0 break;

	set @cnt = celling(30 + 10 * rand())  -- и для каждого создать 30-40 заказов
	set @i = 0
	while @i < @cnt
	begin
		exec spCreateOrder @AgentID  -- В генерацией записей проблем нет
		set @i = @i + 1
	end
end
close c; deallocate c
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122826
BBS_BOSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
court, Благодарю!
Понятно и то что нужно.
Удачи и с наступающим!
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122854
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BBS_BOSS
alexeyvg, Спасибо за ваше решение, но что же выйдет в итоге?
В итоге выйдет "сгенерировать от 30 до 40 заказов для каждого агента (15 шт)"
court
имхо ТС курсор "ищет" )
Ну, если в задании написано "сделать курсор", то да.
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122860
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
alexeyvg
К сожалению, в запросах rand() не работает

Как это?
Код: sql
1.
2.
3.
4.
select v.number, rand(convert(binary(16), newid())) rnd
from master..spt_values v
where v.type='P' and v.number between 0 and 9
order by 2


Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
number      rnd
----------- ----------------------
2           0,0562713371094849
0           0,235415268121053
7           0,320869618459312
5           0,324643521105064
4           0,35400664188013
8           0,40887935968713
6           0,416179720480056
1           0,423589006435972
9           0,666163393758403
3           0,776453799776711
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122866
Фотография alexeyvg
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны
Как это?
Да, виноват, про newid() забыл, раньше его не было, извращались с вьюхой...
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122897
uaggster
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Народ, ну вы чего? Какая, нафиг, переписка Энгельса с Каутским?
Отобрать всё, и поделить!

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
SELECT IDENTITY(INT, 1, 1) id
	,Concat(a.name, ROW_NUMBER() OVER (ORDER BY 1 / 0)) name 
INTO #Agents
FROM string_split(Replicate(';', 14), ';') t
CROSS APPLY (VALUES ('Agent')) a(name)

SELECT IDENTITY(INT, 1, 1) id
	,Cast(a.id as int) AgentId
	,CURRENT_TIMESTAMP CreateDate
into #Orders
FROM #Agents a
CROSS APPLY string_split(Replicate(';', 30 + ABS(CHECKSUM(NewId())) % 10), ';') t

SELECT IDENTITY(INT, 1, 1) id
	,Concat(a.name, ROW_NUMBER() OVER (ORDER BY 1 / 0)) name 
INTO #Goods
FROM string_split(Replicate(';', ABS(CHECKSUM(NewId())) % 10), ';') t
CROSS APPLY (VALUES ('Good')) a(name) 

SELECT IDENTITY(INT, 1, 1) id
	,Concat(a.name, ROW_NUMBER() OVER (ORDER BY 1 / 0)) name 
INTO #Colors
FROM string_split(Replicate(';', ABS(CHECKSUM(NewId())) % 10), ';') t
CROSS APPLY (VALUES ('Color')) a(name) 

Select IDENTITY(INT, 1, 1) id 
,t.ColorId 
,t.GoodsId
,CURRENT_TIMESTAMP CreateDate
into #GoodProperties
	from #Goods g
	outer apply (Select top (Select ABS(CHECKSUM(NewId())) % (Select count(*) from #Colors) + 1) c.id ColorId , g.id GoodsId from #Colors c Order by NEWID()) t

Select IDENTITY(INT, 1, 1) id 
,t.OrderId
,t.GoodId 
,ABS(CHECKSUM(NewId())) % 100 + 1 GoodCount
into #OrderDetails
	from #Orders g
	outer apply (Select top (Select ABS(CHECKSUM(NewId())) % (Select count(*) from #Goods) + 1) c.id GoodId , g.id OrderId from #Goods c Order by NEWID()) t

Select * from #Agents
Select * from #Orders
Select * from #Colors
Select * from #Goods
Select * from #GoodProperties
Select * from #OrderDetails


С количествами там надо проверить, а то с +/- 1 вечная беда, а так вполне себе.
Это ж генерация! Генерируй, не хочу.
:-)
...
Рейтинг: 0 / 0
Передача списка в лист
    #40122911
BBS_BOSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Получилось, точнее не получилось, это
Папка на гугл диске со скринами
...
Рейтинг: 0 / 0
Передача списка в лист
    #40123224
BBS_BOSS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Итоговая версия взята из modify и выглядит так:


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
USE [online_store]
GO
/****** Object:  StoredProcedure [dbo].[GenerateOrders]    Script Date: 26.12.2021 23:05:18 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[GenerateOrders]
as 
declare c cursor GLOBAL STATIC  READ_ONLY
for
  select Agents.Id from Agents ;

declare @number_order INT, @AgentID INT;

open c
while 1=1
begin

	fetch next from c into @AgentID 
	if @@fetch_status < 0 break;
	Set @number_order = CEILING(30 + 10 * rand()) -- и для каждого создать 30-40 заказов
	while @number_order > 0
	begin
		exec CreateOrder @AgentID 
		set @number_order = @number_order - 1
	end
end
close c; deallocate c;




---------------------------------------------------------


Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
USE [online_store]
GO
/****** Object:  StoredProcedure [dbo].[CreateOrder]    Script Date: 26.12.2021 23:31:36 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER PROCEDURE [dbo].[CreateOrder](@AgentID INT)
as 
INSERT INTO Orders (AgentId, CreateDate) VALUES (@AgentID, GETDATE());




Ещё раз убедился, что иногда стоит проверять написание буквы с. Случайно написав раз на русской раскладке, можно застопорить работу на несколько часов или суток
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача списка в лист
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]