Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Всем привет! Нужна помощь знатоков! Есть ХП (скрипт ниже), данные выбираю по городу вручную, я сторонник автоматизации. Мне хотелось бы, чтобы данные брались из таблицы городов (dbo.town) - (id, nameTown), а не тупое проставление города... причём по порядку с первого и по последний ID города... важно выбрать 5% от общего числа доступных клиентов по данному городу (active = 1) (то есть, если набираем 5% от общего количества человек по городу, то выводим результат, иначе переходим на другой город и также выводим результат)... я это вижу как написать курсор... хотя не уверен, более того важно выбирать 5% от свободных клиентов, статус клиента, которому звонили = 0, не звонили = 1, свободный клиент(которому не звонили) - (Efficiency = 1) . Важно ещё то, что сегодня запустили скрипт, данные получили, обзвонили... завтра захотят запустить скрипт, данные нужны свежие... то есть минус вчерашние (и не только вчерашние) обзвоненные клиенты (... getdate()?)

ALTER PROCEDURE [dbo].[RandomListOutgoingCalls]
	@guid uniqueidentifier = NULL,
	@LId int = 0
AS
BEGIN
	-- SET NOCOUNT ON added to prevent extra result sets from
	-- interfering with SELECT statements.
	SET NOCOUNT ON;

     declare @eId int, @res int, @rId int, @tbId int, @mdNum nvarchar(30), @descr nvarchar(1000), @usrt nvarchar(10), @town nvarchar(525)

		set @res = 0
		set @tbId = NULL
		set @mdNum = ''
		set @descr = ''
		set @usrt = '19950;'

		select @eId = t.emp_Id, @rId = e.rulesId from G_TempEmployees t
		 inner join g_employees e on e.Id=t.emp_Id
		 where t.Emp_GUID=@guid

		if(@rId>=2) 
		  begin	

			   -- проверка на список
			  if(@LId=0)
               begin	
					 set @town = 'Орехово-Зуево'
					 --if(patindex('%'+cast(@eId as nvarchar)+';%',@usrt)>0) set @town = 'Домодедово' 
	
					 set @tbId = (select top 1 Id from dbo.ListOfOutgoingCalls WITH(NOLOCK) 
						where Efficiency=1 and tmpBlock_act=0 and tmpBlock_dt is null and block=2
							and statusId=0 and nameOrg='Столплит' and NameTown=@town and statusId<>8
							order by newId())

					 set @mdNum = ''/*(select top 1 Number from ListOfCardNumbers
								where Efficiency=1 and tmpBlock_act=0 and tmpBlock_dt is null 
							order by newId())*/

					if(@tbId is not null and @mdNum is not null) 
					  begin	
						update dbo.ListOfOutgoingCalls set tmpBlock_act='1', tmpBlock_dt=getdate() where Id=@tbId
						  /* update ListOfCardNumbers set tmpBlock_act='1', tmpBlock_dt=getdate() where Number=@mdNum */
					   end	 

					 -- показываем в лог таблице запись о отдаче звонка	  
					 insert dbo.LogOfOutgoingCalls (EmpId, Descr, ListId, dtCreate) 
						values (@eId,'Звонок клиенту '+cast(@tbId as nvarchar(10))+' совершает КС '+cast(@eId as nvarchar(10)),@tbId, getdate())

			   end
			  else
			   begin
					    set @tbId = @LId
						select @mdNum = isnull(app.mdCard_Number,''), @descr = app.Estimation 
						    from dbo.ListOfOutgoingCalls list WITH(NOLOCK) 
							 inner join g_applications app on app.Id=list.create_appId 
							   where list.Id=@LId
			   end		

			 select Id, fioUser1, fioUser2, fioUser3, PhoneMob, PhoneWork, PhoneHome, 
			    isnull(original_appId,'') as original_appId, isnull(create_appId,'') as create_appId, 
				  isnull(term_credit,'') as term_credit,
			  @mdNum as NumberCard, isnull(am_approved,'') as am_approved,
				term_credit, consent_client, degree_ser, quality_credit, statusId, @descr as descr, 
					isCall, isnull(desc_mart,'') as desc_mart, isnull(desc_mart16,'') as desc_mart16, 
						isnull(desc_mart17,'') as desc_mart17   
				from dbo.ListOfOutgoingCalls WITH(NOLOCK) where Id=@tbId 
	
		  end

	
END

SELECT * FROM dbo.ListOfOutgoingCalls

Спасибо заранее за помощь! С удовольствием отвечу на все вопросы и с удовольствием хотел бы разобраться с такой не простой задачей!

P.S. SQL Server 2008 R2
11 авг 11, 16:05    [11104957]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
важно выбрать 5% от общего числа доступных клиентов по данному городу (active = 1) (то есть, если набираем 5% от общего количества человек по городу, то выводим результат, иначе переходим на другой город и также выводим результат)... я это вижу как написать курсор... хотя не уверен, более того важно выбирать 5% от свободных клиентов, статус клиента, которому звонили = 0, не звонили = 1, свободный клиент(которому не звонили) - (Efficiency = 1) . Важно ещё то, что сегодня запустили скрипт, данные получили, обзвонили... завтра захотят запустить скрипт, данные нужны свежие... то есть минус вчерашние (и не только вчерашние) обзвоненные клиенты (... getdate()?)

Вот это вот все лучше оформить как предложено в https://www.sql.ru/forum/actualthread.aspx?tid=127456 п.6
11 авг 11, 16:37    [11105202]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Поддерживаю - без тест-данных задача выглядит зело тоскливо, объяснение на пальцах не катит.
11 авг 11, 17:19    [11105474]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Glory, спасибо за рекомендации, приведу по три записи из таблиц:

G_TempEmployees:

id	Emp_Id	Shop_Id	Emp_Guid	App_Id	dtInput
1	6	72	C31C40B2-C632-4EA3-B857-DAA1E7BAC567	NULL	08.12.2008 9:16
14	401	38	9A1B3BE3-E626-484A-9B10-3B259E893E15	NULL	08.12.2008 10:37
15	300	38	B73B3230-EDA3-4F7B-9D3D-FB95628E780F	NULL	08.12.2008 10:40

G_Employees
id	shop_id	user_fio	user_fio1	user|_fio2
20717	2	Коптева	Екатерина	Евгеньевна
20718	2	Мамышева	Надежда	Васильевна
20719	2	Колодин	Николай	Сергеевич

ListOfOutgoingCalls
ID	fioUser	fioUser1	fioUser2	phoneMob	phoneWork	phoneHome	Efficiency	originall_appId	tmpBlock_Act	tmpBlock_dt
1	НАБАТЧИКОВ	ВИКТОР	ЯКОВЛЕВИЧ	9165566249	4966146449	4966121338	0	NULL	1	23.03.2011 18:29
2	НАБИЕВА	НАЗИМА	НАЗИТОВНА	9060444915	4999099441	4992093983	0	NULL	1	24.03.2011 16:23
3	НАБОКОВА	НИНА	ВИКТОРОВНА	9057269036		4956053543	0	NULL	1	24.03.2011 14:33

ListOfOutgoingCallsByRegion
id	nameTown	Cnt	OrderList
5	Воскресенск	104	4
32	Одинцово	99	3
19	Клин	118	2

G_Applications
id	Eid	userFIO	userFIO1	userFIO2	clientFIO	clientFIO1	clientFIO2	dtInput
7	6	Огурлуева	Рузана	Аликовна	Петров	Петр	Петрвич	22.08.2008 16:30
8	8	Тарасов	#ИМЯ?	Сергеевич	Батраков	Денис	Викторович	22.08.2008 17:11
9	7	Воробьев	Дмитрий	Владимирович	Воробьев	Дмитрий	Владимирович	22.08.2008 17:42

Надеюсь всё написал!
11 авг 11, 17:32    [11105589]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
Надеюсь всё написал!

И что из этих данных должно получиться в результате ?
11 авг 11, 17:34    [11105610]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
iap
Member

Откуда: Москва
Сообщений: 47142
Alexxx_22
Надеюсь всё написал!
И не надейтесь.
Трудно что ли написать
IF OBJECT_ID(N'G_TempEmployees','U') IS NOT NULL DROP TABLE G_TempEmployees;
CREATE TABLE G_TempEmployees(id INT ....
INSERT G_TempEmployees(id, ....
          SELECT 1,6,72, ...
UNION ALL SELECT 14, 401, 38, ...
..............................................
для каждой таблицы?
11 авг 11, 17:37    [11105643]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Данные выбираю по городу вручную. Мне хотелось бы, чтобы данные брались из таблицы городов (ListOfOutgoingCallsByRegion), а не тупое проставление города... причём по порядку с первого и по последний ID города... важно выбрать 5% от общего числа доступных клиентов по данному городу (то есть, если набираем 5% от общего количества человек по городу, то выводим результат, иначе переходим на другой город и также выводим результат) (ориентир 100 человек в день)... важно также проставить дату обзвона для будущего игнора (чтобы не спамить)
11 авг 11, 17:44    [11105689]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
Данные выбираю по городу вручную. Мне хотелось бы, чтобы данные брались из таблицы городов (ListOfOutgoingCallsByRegion), а не тупое проставление города...

Вы не поняли
Вот из тех данных, которые вы привели, что должно конкретно должно получиться ?
Какой конкретный результат ?
11 авг 11, 17:48    [11105727]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
И еще замечание iap-а учтите... Или вы думаете здесь сидят монстры пишущие любой запрос "в голове" и всегда 100% верно? Нам тоже наши догадки тестировать надо. ;)
11 авг 11, 17:55    [11105781]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Мне нужно на выходе получить город по ID (важно чтобы Id города был по порядку, как заведено в таблице) , фамилия, имя, отчество клиента, телефоны... 5 % клиентов от общего количества людей в базе по данному городу нужно выбрать... если клиентов меньше в городе, чем запрошено (из свободных, ещё не обзвоненных), то переходим по Id города дальше... примерно 100 человек в день! то есть при выборе запускаем апдейт и проставляем дату сегодняшную... чтобы в будущем этих клиентов не обзванивать!

P.S. Если ещё будут вопросы, отвечу!
11 авг 11, 18:13    [11105909]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
Мне нужно на выходе получить город по ID (важно чтобы Id города был по порядку, как заведено в таблице) , фамилия, имя, отчество клиента, телефоны...

Мда.
Возьмите те данные, что вы привели и _покажите_, какой результат нужен
Не надо снова повторять про 5%
11 авг 11, 18:16    [11105927]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Только город!
11 авг 11, 18:44    [11106090]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Парни, я не правильно написал? Извините, если не так написал, но реально помощь нужна!!! Отвечу на любой вопрос по теме!
11 авг 11, 19:37    [11106342]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Так никто и не поможет с процедурой?
12 авг 11, 10:42    [11107957]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
Отвечу на любой вопрос по теме!

Ну так ответьте уже
12 авг 11, 10:49    [11108013]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Glory, мне нужны все данные, которые запрашиваются в последнем селекте:
 select Id, fioUser1, fioUser2, fioUser3, PhoneMob, PhoneWork, PhoneHome, 
			    isnull(original_appId,'') as original_appId, isnull(create_appId,'') as create_appId, 
				  isnull(term_credit,'') as term_credit,
			  @mdNum as NumberCard, isnull(am_approved,'') as am_approved,
				term_credit, consent_client, degree_ser, quality_credit, statusId, @descr as descr, 
					isCall, isnull(desc_mart,'') as desc_mart, isnull(desc_mart16,'') as desc_mart16, 
						isnull(desc_mart17,'') as desc_mart17   
				from dbo.ListOfOutgoingCalls WITH(NOLOCK) where Id=@tbId 

но как видишь по предоставленному ранее скрипту, город указан вручную, мне нужно, чтобы город на автомате подставлялся из таблицы ListOfOutgoingCallsByRegion по порядку ... по Id то есть...при превышении 5% обзвоненных клиентов (надоел я тебе этими 5%))) извини)... поле есть tmpBlock_dt в LogOfOutgoingCalls , где фиксируется дата обзвона
12 авг 11, 11:56    [11108590]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
Alexxx_22
мне нужно, чтобы город на автомате подставлялся из таблицы ListOfOutgoingCallsByRegion по порядку

И что мешает использовать таблицу ListOfOutgoingCallsByRegion в запросе ?
12 авг 11, 11:59    [11108635]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Использовать таблицу городов нужно, но как сделать так, чтобы мы выбирали по первому городу? нашли нужное количество клиентов, поставили дату обзвона (поле tmpBlock_dt), не нашли нужное количество клиентов, переходим в другой город по следующему Id и набираем недостающее количество клиентов.

P.S. Думаю, что это можно сделать курсором, но не знаю как (((
12 авг 11, 12:56    [11109137]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

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

Ну так 5 % клиентов от общего количества людей в базе по данному городу нужно выбрать... если клиентов меньше в городе, чем запрошено (из свободных, ещё не обзвоненных), то переходим по Id города дальше...
12 авг 11, 12:58    [11109148]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Glory, объясню иначе... Нужно обзвонить 100 человек (к примеру), выбираем с первого ID города, если tmpBlock_dt (дата обзвона) заполнена, то выбираем любого свободного клиента этого города, которому ещё не звонили... иначе переходим на следующий ID города (то ест в другой город уходим)...

P.S. Это не спам) это предложение для клиентов по оформлению карт для покупок)
P.P.S. Вручную пока делаю, но это не правильно и не логично!
12 авг 11, 14:08    [11109720]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Glory
Member

Откуда:
Сообщений: 104751
select top 1 ... from ... order by ...
12 авг 11, 14:36    [11110013]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
Glory, это как?
12 авг 11, 15:20    [11110489]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
SamMan
Member

Откуда: Moscow
Сообщений: 759
Alexxx_22
это как?


Вы так лаконичны... Что именно не понятно в предложенном подходе? Не знаете о существовании опции ТОП у СЕЛЕКТ-а? Или у вас непонятки концептуальные?
12 авг 11, 18:10    [11112009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите переделать хранимую процедуру!  [new]
Alexxx_22
Guest
SamMan, ну как же можно не знать Toп у селекта))) возвращает необходимое количество записей первых или последних с order by desc. Но я спрашивал не об этом! Таблицы объединить без проблем, но как курсором (или без него) выбирать нужное количество клиентов из доступных, обновлять дату обзвона и переходить в другой город, если не набрали нужное количество клиентов (100 человек)? Топ 1 в селекте по таблице городов даст мне первый город и как дальше?
12 авг 11, 19:20    [11112388]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить