Гость
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача списка в лист / 12 сообщений из 12, страница 1 из 1
24.12.2021, 15:56
    #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
24.12.2021, 16:13
    #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
24.12.2021, 16:20
    #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
24.12.2021, 16:21
    #40122811
BBS_BOSS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача списка в лист
alexeyvg, Спасибо за ваше решение, но что же выйдет в итоге?
...
Рейтинг: 0 / 0
24.12.2021, 16:34
    #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
24.12.2021, 16:47
    #40122826
BBS_BOSS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача списка в лист
court, Благодарю!
Понятно и то что нужно.
Удачи и с наступающим!
...
Рейтинг: 0 / 0
24.12.2021, 18:18
    #40122854
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача списка в лист
BBS_BOSS
alexeyvg, Спасибо за ваше решение, но что же выйдет в итоге?
В итоге выйдет "сгенерировать от 30 до 40 заказов для каждого агента (15 шт)"
court
имхо ТС курсор "ищет" )
Ну, если в задании написано "сделать курсор", то да.
...
Рейтинг: 0 / 0
24.12.2021, 18:37
    #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
24.12.2021, 19:21
    #40122866
alexeyvg
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача списка в лист
Сон Веры Павловны
Как это?
Да, виноват, про newid() забыл, раньше его не было, извращались с вьюхой...
...
Рейтинг: 0 / 0
24.12.2021, 22:21
    #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
24.12.2021, 23:51
    #40122911
BBS_BOSS
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Передача списка в лист
Получилось, точнее не получилось, это
Папка на гугл диске со скринами
...
Рейтинг: 0 / 0
26.12.2021, 21:33
    #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
Форумы / Microsoft SQL Server [игнор отключен] [закрыт для гостей] / Передача списка в лист / 12 сообщений из 12, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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