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

Откуда:
Сообщений: 34
Доброго дня товарищи,возникла еще сложнее задача имеем код
Declare
@SalerID int =9929, 
@BeginDate date = '23.11.2017',
@EndDate date = '23.11.2017',
@ChangeStartTime int = 1,
@StartTime time = '08:30';
Use ANTHILL

select 
	Distinct v.visitid, 
	ISNULL(cal.Date, CAST(v.VisitStartDate as date)) as Calendar
	,ROW_NUMBER() OVER(PARTITION BY ISNULL(v.SalerID,sl.SalerID),ISNULL(cal.Date, CAST(v.VisitStartDate as date)) ORDER BY CAST(v.VisitStartDate AS time) ASC)as num

	,ISNULL(v.SalerID, sl.SalerID) as SalerID
	,ISNULL(v.AddrID, sl.AddrID) as AddrID
	,v.AddrID as visAddr
	,sl.AddrID as routAddr
	,ISNULL(CONVERT(date, v.VisitStartDate),CONVERT(date, sl.RouteDate)) as VisitDate
	,convert(varchar(5),v.VisitStartDate, 108) as sTime
	,convert(varchar(5),v.VisitEndDate, 108) as eTime
	,AVG(d.Lat) as vLat,AVG(d.Long) as vLong
	
	,sss.salername as Manager, ss.salername as SV
	,s.SalerName as SalerName
	,c.NameScreen ,c.NameScreen +' - '+ a.AddrName as AddrName
 
	,a.Lat as AddrLat
	,a.Long as AddrLong
	,v.VisitStartDate as vsd
	,v.VisitEndDate as ved
	,DATEDIFF ( MINUTE , v.VisitStartDate , v.VisitEndDate) as dif_time
	,sl.RouteDate as datePlan
	,edd.DocID
	,sf.FirmID   
	,f.FirmName
	,cal.WeekDayName as WeekDN
	,(Round(111100*Acos(Sin(AVG(d.Lat))*Sin(a.Lat) + Cos(AVG(d.Lat))*Cos(a.Lat) *Cos(a.Long-AVG(d.Long))), 0)) as distance --показывает дистанцию 
		,Сase
			when (Round(111100*Acos(Sin(AVG(d.Lat))*Sin(a.Lat) + Cos(AVG(d.Lat))*Cos(a.Lat) *Cos(a.Long-AVG(d.Long))), 0))>500 then (Str(v.AddrID) + '_' + CAST(CAST(v.VisitStartDate as date) as varchar))
			else null
		end as big_dist -- просчет дистанции больше 500 метров

	,datename(weekday, ISNULL(cal.Date, CAST(v.VisitStartDate as date))) as WeekDN
	,count (ed.docid) as countDocs
	
	,indicator_countDoc = 
		Case 
			WHEN count(ed.docid) > 0 THEN 1
			else  0
		End
	,FactTO= 
		Case
			when ed.DocID>0 and abs(ed.STS)>=3 and st.StsName like '%Проведен%' then sum(i.UnitWeight*edd.Quantity*0.001)
			else null
		End
	--,sum(i.UnitWeight * edd.[Quantity])/1000  as total_Weigh
	,indicator = 
		Case 
			WHEN v.VisitStartDate is NULL THEN 0
			else  2
		End
	,indicatormenpat = 
		Case
			when DATEDIFF ( MINUTE , v.VisitStartDate , v.VisitEndDate) < 5 then 1 ----Нахождение в точке <5
			else 0
		end	 
	,indicatornoVis=
		Case 
			When v.AddrID is NULL then 1
			Else 0
		end 

	,indicator2 = 
		Case 
			WHEN sl.RouteDate is NULL THEN 0
			else  1
		End

	,sl.sts as sl_sts

from Calendar as cal

left outer join SalerRoutes as sl on sl.RouteDate=cal.Date and (sl.SalerID in (@SalerID) or sl.SalerID is null)

FULL outer join Visits as v on sl.AddrID = v.AddrID and CAST(sl.RouteDate as date) = CAST(v.VisitStartDate as date) and cal.Date = CAST(v.VisitStartDate as date) 
and (v.SalerID = sl.SalerID or v.SalerID is null or sl.SalerID is null)

left join Salers as s on s.SalerID = ISNULL(v.SalerID,sl.SalerID) --and s.SalerID = v.SalerID 

left outer join ExportDocuments as ed on v.VisitID= ed.VisitID and ed.sent=1
left  join ExportDocDetails as edd on edd.DocID=ed.DocID
 left outer join items as i on i.ItemID=edd.ItemID


left join Addresses as a on  a.AddrID = ISNULL(v.AddrID,sl.AddrID)
left join Clients as c on a.ClientID = c.ClientID

left join SalerFirms as sf on sf.SalerID =  ISNULL(v.SalerID,sl.SalerID)
left join Firms as f on f.FirmID = sf.FirmID
LEFT OUTER JOIN DeviceGpsLog as d ON v.SalerID = d.SalerID and v.VisitID = d.VisitID

inner join salers as ss on s.parentid=ss.salerid
inner join salers as sss on ss.parentid=sss.salerid

left join Statuses as st on st.StsID=ed.STS

CAST(v.VisitStartDate as date)between @BeginDate and @EndDate) 
where  (cal.[Date] between @BeginDate and @EndDate or CAST(v.VisitStartDate as date) between @BeginDate and @EndDate) 
and ISNULL(v.SalerID, sl.SalerID) in (@SalerID)
and f.firmid=342
and (sl.sts = 1 or sl.sts is null) -----проверяем отключен ли маршрут
---------------------------------------------------
Group by  sss.salername , ss.salername , s.SalerName,  v.visitid, cal.Date, v.AddrID, sl.AddrID, v.SalerID, sl.SalerID,c.NameScreen, a.AddrName, v.VisitStartDate, v.VisitEndDate,
 sl.RouteDate,a.Lat,a.Long,sf.FirmID,f.FirmName,cal.WeekDayName ,sl.sts, ed.DocTypeID,
	st.StsName , ed.STS , ed.DocID ,edd.DocID 
order by  Calendar,num
в данном отчете происходит конфликт параметров.
В данном коде находятся начальные и конечные значения GPS в таблице DeviceGpsLog у каждого VisitID 2 строки, начальные\конец (1строка) и средни\конец (2строка)
LEFT OUTER JOIN DeviceGpsLog as d ON v.SalerID = d.SalerID and v.VisitID = d.VisitID
конфликтует с
sum(i.UnitWeight * edd.[Quantity])/1000  as total_Weigh
тут задваивается значение если в таблице DeviceGpsLog 2 строки.
Вопрос заключается в в следующем,можете подсказать функцию или примерный код, как сделать так чтоб не было задваения результата.
27 ноя 17, 10:20    [20985020]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Пацанчик с раёна
Member [заблокирован]

Откуда:
Сообщений: 13
Pasher
подсказать функцию или примерный код, как сделать так чтоб не было задваения результата
Задвоение результата, как правило, означает, что исходный код запроса содержит логическую ошибку - то есть, сервер-то выполняет именно то, что вы написали, но при этом, то, что вы написали - написано с ошибкой.
А если код написан с ошибкой, то нужно найти ошибку и исправить код, а не искать какую-то там функцию, которая это всё исправит.
27 ноя 17, 10:29    [20985040]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

Откуда:
Сообщений: 34
Пацанчик с раёна,

Понимаете,если убрать соединение LEFT OUTER JOIN DeviceGpsLog as d ON v.SalerID = d.SalerID and v.VisitID = d.VisitID
То данные на выходе те что надо,
Но без этой строки нельзя просчитать координаты,вот и приходится задавать тут такие вопросы
потому как сам не могу найти в интернете нужное.
27 ноя 17, 10:33    [20985048]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Pasher
Пацанчик с раёна,

Понимаете,если убрать соединение LEFT OUTER JOIN DeviceGpsLog as d ON v.SalerID = d.SalerID and v.VisitID = d.VisitID
То данные на выходе те что надо,
Но без этой строки нельзя просчитать координаты,вот и приходится задавать тут такие вопросы
потому как сам не могу найти в интернете нужное.

значить определите условия уникаьлности для DeviceGpsLog, вплоть до top 1 (свят свят :))
27 ноя 17, 10:35    [20985052]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

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

Не могли бы Вы пример написать
27 ноя 17, 10:44    [20985076]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Pasher
TaPaK,

Не могли бы Вы пример написать

я не очень понимаю что у вас конфликтует
sum(i.UnitWeight * edd.[Quantity])/1000  as total_Weigh 

если эти объекты у вас не пересекаются и на вскидку с DeviceGpsLog всё агрегирует... так что двоит у вас не из за этого
27 ноя 17, 10:50    [20985103]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

Откуда:
Сообщений: 34
TaPaK,
Это просто сумма показателей которые выдают таблицы items и ExportDocDetails.
взаимодействие таблиц идет по VisitID
Т.к. в таблице DeviceGpsLog с одним VisitID имеется 2 записи(она хранит данные начало\конец и середина\конец), то значение дублируется,а вот если в данной таблице 1 запись то она не дублируется,и выводится нужное значение.
27 ноя 17, 11:57    [20985304]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Pasher,
нахрена тогда вообще это писать было?
автор
конфликтует с
sum(i.UnitWeight * edd.[Quantity])/1000 as total_Weigh
27 ноя 17, 12:01    [20985323]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Pasher,
SELECT
  ...
  AVG(d.Lat) as vLat,AVG(d.Long) as vLong
  ...
FROM
  ...
  LEFT OUTER JOIN DeviceGpsLog as d ON v.SalerID = d.SalerID and v.VisitID = d.VisitID
  ...

SELECT
  ...
  d.[vLat],
  d.[vLong],
  ...
FROM
  ...
  OUTER APPLY (
     SELECT
        [vLat] = AVG( d.[Lat] ),
        [vLong] = AVG( d.[Long] )
     FROM
        DeviceGpsLog d
     WHERE
            v.[SalerID] = d.[SalerID]
        AND v.[VisitID] = d.[VisitID]
  ) d
  ...

P.S. ТС, русский подтяни хотя бы до уровня твердой четверки.
P.P.S. неуважительно выкладывать портянки кода, не приведя к формату, показывающему проблему
27 ноя 17, 12:12    [20985352]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Руслан Дамирович,

ваш запрос даст ему чёрти что, если у него дубли.
27 ноя 17, 12:14    [20985361]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Руслан Дамирович,

ваш запрос даст ему чёрти что, если у него дубли.

у него дубли по его же словам из-за этой таблицы. удалим эту проблему - раскопаем следующую. ему в отличие от соседнего топика поможет только лоботомия - решение задачи в лоб.
27 ноя 17, 12:15    [20985371]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Руслан Дамирович
TaPaK
Руслан Дамирович,

ваш запрос даст ему чёрти что, если у него дубли.

у него дубли по его же словам из-за этой таблицы. удалим эту проблему - раскопаем следующую. ему в отличие от соседнего топика поможет только лоботомия - решение задачи в лоб.

автор
в таблице DeviceGpsLog у каждого VisitID 2

а вы их дружненько усреднили, и так соёдёт(картинко)
27 ноя 17, 12:16    [20985381]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

Откуда:
Сообщений: 34
Руслан Дамирович,
Да это помогло,никаких больше ошибок не вылезло, а чем вы сделали,я встречаюсь впервые,и спасибо вам я теперь это изучу на будущее.
27 ноя 17, 13:50    [20985818]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Руслан Дамирович
пропущено...

у него дубли по его же словам из-за этой таблицы. удалим эту проблему - раскопаем следующую. ему в отличие от соседнего топика поможет только лоботомия - решение задачи в лоб.

автор
в таблице DeviceGpsLog у каждого VisitID 2

а вы их дружненько усреднили, и так соёдёт(картинко)

Я ничего не усреднял. В смысле усреднял не я, я просто переписал LEFT JOIN (картинко)

У него эти авераги и так в коде были - я ему просто нарисовал, как ему надо, чтобы остальное не задваивалось.
27 ноя 17, 14:51    [20986060]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

Откуда:
Сообщений: 34
Руслан Дамирович,

Но в итоге вы помогли,хоть и обосрали,но помогли!
27 ноя 17, 15:10    [20986157]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Руслан Дамирович,

автор
У него эти авераги и так в коде были - я ему просто нарисовал, как ему надо, чтобы остальное не задваивалось.

рукалицо
27 ноя 17, 15:29    [20986273]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Pasher
Руслан Дамирович,
Но в итоге вы помогли,хоть и обосрали,но помогли!

Кто кого "обсирал"?
Совет подучить русский язык?
Или просьба оформлять код?
Или упоминание лоботомии в контексте способа решения задачи, когда некогда разбираться с заскоками "пациента" (кодом)?

Все это всего-лишь ваша личная интерпретация написанного мною.
Если вам нужно окрасить это все в радужный цвет, пожалуйста, вот вам куча ))))))))), расставьте их, где сочтете нужным.
27 ноя 17, 16:51    [20986586]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Pasher
Member

Откуда:
Сообщений: 34
Руслан Дамирович,
По поводу кода могу согласится,не всегда все хорошо и красиво,потому как много не знаю еще,и спрашиваю у вас как у опытных,кто мог бы поделится опытом!
По поводу лоботомии - я счел это контекст подразумевающий что я тупой. Поэтому и сказал.
Но то что вы написали помогло мне изучить новое,непосредственно используемое на практике!И за это вам огромное спасибо!
27 ноя 17, 16:57    [20986596]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
TaPaK
Руслан Дамирович,
...
рукалицо

На меня-то за что? Вот гуглопоиск по "ANTHILL" выдает аж 3 "интересных" ссылки:
серая площадка в ONION;
магазин формикариев;
игра ANTHILL.
Предлагаю поиграть в "угадайку", что из этого относится к ТС. Ничего из - тоже вариант.
27 ноя 17, 16:57    [20986597]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6794
Руслан Дамирович
TaPaK
Руслан Дамирович,
...
рукалицо

На меня-то за что? Вот гуглопоиск по "ANTHILL" выдает аж 3 "интересных" ссылки:
серая площадка в ONION;
магазин формикариев;
игра ANTHILL.
Предлагаю поиграть в "угадайку", что из этого относится к ТС. Ничего из - тоже вариант.

а просто название БД "муравейник" прям не комильфо? Было время когда сервера называли так, wiki по вархаммеру выглядела тускло :)
27 ноя 17, 17:02    [20986610]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Ролг Хупин
Member

Откуда: Чебаркуль
Сообщений: 3466
Pasher
Руслан Дамирович,
По поводу кода могу согласитЬся,не всегда все хорошо и красиво,потому как много не знаю еще,и спрашиваю у вас как у опытных,кто мог бы поделитЬся опытом!
По поводу лоботомии - я счел это контекст подразумевающий что я тупой. Поэтому и сказал.
Но то что вы написали помогло мне изучить новое,непосредственно используемое на практике!И за это вам огромное спасибо!


да не за што
28 ноя 17, 15:47    [20988729]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
982183
Member

Откуда: VL
Сообщений: 3350
Pasher
По поводу лоботомии - я счел это контекст подразумевающий что я тупой. Поэтому и сказал.

Зачастую лоботомию надо делать не тупым, а умным.
Чересчур умным.
Не всегда это положительно на конечный результат влияет.
28 ноя 17, 16:03    [20988787]     Ответить | Цитировать Сообщить модератору
 Re: Сложная задача\прошу направить в правильно русло  [new]
Руслан Дамирович
Member

Откуда: Резиновая нерезиновая
Сообщений: 940
Коллеги, давайте не будем уподобляться доктору Хаусу и искать у каждого встречного поперечного волчанку.
28 ноя 17, 16:28    [20988864]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить