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

Откуда:
Сообщений: 265
У меня в общем selecte бывают что jobid in (9,10) одновременно могут быть и 9 и 10 так и должно быть, но можно как то сделать что бы брался только первый кто стоит, через TOP 1 нельзя.


SELECT w.EstimateID, NAME AS CSD
INTO #CSD 
from estimateworkgroups w
	inner join actors a on actor = actorid
where w.status>0 and (jobid in (9,10) or actorid in (687000, 109000)) AND A.[Status] > 0 AND w.ActorID <> 208
order by jobid  
21 фев 17, 10:51    [20232040]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
Pabl0
Member

Откуда:
Сообщений: 265
Две записи в этой таблице
estimateworkgroups w
можно как то не на select, а в join к примеру прописать что то вроде TOP 1
21 фев 17, 10:52    [20232049]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Pabl0,

top 1 with ties
21 фев 17, 10:55    [20232059]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
Pabl0
Member

Откуда:
Сообщений: 265
TaPaK, прочитал про ваш ответ и действительно должке работать верно, но он мне тогда вообще выдает пусто, есть еще другие варианты?


SELECT TOP (1) WITH TIES w.EstimateID, NAME AS CSD
INTO #CSD 
from estimateworkgroups w
	inner join actors a on actor = actorid
where w.status>0 and (jobid in (9,10) or actorid in (687000, 109000)) AND A.[Status] > 0 AND w.ActorID <> 208
order by jobid 
21 фев 17, 11:01    [20232103]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
Pabl0,

ну insert и не выдаёт ничего
21 фев 17, 11:02    [20232113]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
Pabl0
Member

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



SELECT TOP (1) WITH TIES w.EstimateID, NAME AS CSD
INTO #CSD 
from estimateworkgroups w
	inner join actors a on actor = actorid
where w.status>0 and (jobid in (9,10) or actorid in (687000, 109000)) AND A.[Status] > 0 AND w.ActorID <> 208
order by jobid   

SELECT * FROM #CSD
21 фев 17, 11:07    [20232147]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
Pabl0
Member

Откуда:
Сообщений: 265
полностью покажу запрос выдает на нижней группировке такую ошибку "The TOP N WITH TIES clause is not allowed without a corresponding ORDER BY clause."

  
	SELECT w.EstimateID, NAME AS CSD
	INTO #CSD 
	from estimateworkgroups w
		inner join actors a on actor = actorid
	where w.status>0 and (jobid in (9,10) or actorid in (687000, 109000)) AND A.[Status] > 0 AND w.ActorID <> 208
	order by jobid   


  SELECT TOP (1) WITH TIES Applic, T1.Borned, T1.Code, T1.EstimateID, EstCurrencyID, EstCode, EstName, T1.CurrencyID, T1.CurrencyCode, CurrencyName, Initiator, InitiatorName, Division, DivisionCode, 
         DivisionName, Acceptor, AcceptorName, IsCash, CashName, RegionID, RegionName, T1.[Description], T1.Published, T1.Archive, T1.Status, T1.Owner, HasError, Mnemo, 
         Acceptor2, Acceptor2Name, T1.Author, AuthorName, TotalPrice, StrCode, Selected, EstType, AppBorned, PointID, PointCode, PointName, RegTypeID, RegTypeName,
         EventID, EventName, EventDate, DatePayment, CompanyID, CompanyName, BornDate, NewApplic, cast(0 as int) as PercentPoint, cast('0' as varchar(500)) as  PercentPointName, ISNULL(C.CSD, 'Не определен') AS CSD
  from #TempApplic T1
	  INNER JOIN _EstimateHeads T3 ON T1.EstimateID = T3.Estimate
	  INNER JOIN EstimateWorkgroups T4 ON T3.Estimate = T4.EstimateID
	  INNER JOIN StaffList T5 ON T4.ActorID = T5.ActorID
	  INNER join dbo.ActorsInfo T6 ON T6.ActorID = T5.ActorID 
	  INNER JOIN #CSD C ON C.EstimateID = T1.EstimateID
 where (T5.UserID = @Author or @Author in(1,429000,625000,252000,85000,171000,339000,628000,21000,226000,57000,21000,708000,623000,459000,449000) or  
		   T6.fOtdel= @FOtdel or @FOtdel in (51,13,109,103) or (@author = 719000 and t5.depid = 30) or @depID = 1 OR (@Author IN (737000,702000) AND t5.depid = 78/*  t5.UserID = 374000 AND t4.ActorID <> 9208000 */) OR (@author IN (745000, 747000) and t5.depid = 34) --OR (@author IN (459000, 449000) and t5.depid = 38)
 ) AND T4.[Status] > 0 AND T5.[Status] > 0
  GROUP BY Applic
21 фев 17, 11:14    [20232187]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
Pabl0
Member

Откуда:
Сообщений: 265
а еще у меня MS SQL 2008 и он не подсвечивает TIES
21 фев 17, 11:15    [20232191]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
лолл
Member

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

зачастую вместо TOP..WITH TIES эффективнее использовать фильтрацию через подзапрос с ROW_NUMBER()
21 фев 17, 11:22    [20232248]     Ответить | Цитировать Сообщить модератору
 Re: Вывод на экран  [new]
TaPaK
Member

Откуда: Kiev
Сообщений: 6802
он ниеде не подсвечивает, ну или через нумерацию

;WITH x as ( SELECT ROW_NUMBER... )  SELECT * FROM x WHERE Rn = 1 


или

автор
DECLARE @T TABLE
(
EstimateID INT,
Name VARCHAR(10),
JobId INT
)

INSERT INTO @T VALUES (1,'a',9),(1,'a',10)
INSERT INTO @T VALUES (1,'b',9),(1,'b',10)

SELECT * FROM @T

SELECT TOP 1 WITH TIES
EstimateID ,
Name ,
JobId
FROM @T
ORDER BY
JobId
21 фев 17, 11:24    [20232260]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить