2016-10-30 2 views
-1

Мне нужно найти наиболее распространенного клиента Имя всех клиентов, чей домашний адрес находится в Австралии, используя базу данных AdventureWorks (https://technet.microsoft.com/en-us/library/ms124438(v=sql.100).aspx).Получение максимального значения из запроса

Код, который у меня ниже, дает мне ответ, который мне нужен («Lacey» используется 25 раз), но это приводит к 561 строке. Как я могу ограничить это до 1 строки без с использованием TOP x или SET ROWCOUNT для управления результатами?

SELECT 
    FirstName, 
    COUNT(PP.FirstName) AS FirstNameCount 
FROM 
    Person.Person AS PP 
    INNER JOIN Sales.Customer AS SC 
     ON SC.PersonID = PP.BusinessEntityID 
    INNER JOIN Person.BusinessEntity AS PBE 
     ON PBE.BusinessEntityID = PP.BusinessEntityID 
    INNER JOIN Person.BusinessEntityAddress AS PBEA 
     ON PBEA.BusinessEntityID = PBE.BusinessEntityID 
    INNER JOIN Person.AddressType AS PAT 
     ON PAT.AddressTypeID = PBEA.AddressTypeID 
    INNER JOIN Person.Address AS PA 
     ON PA.AddressID = PBEA.AddressID 
WHERE 
    PAT.AddressTypeID = 2 AND 
    StateProvinceID = 50 OR 
    StateProvinceID = 64 OR 
    StateProvinceID = 66 OR 
    StateProvinceID = 71 OR 
    StateProvinceID = 77 
GROUP BY 
    FirstName 
ORDER BY 
    FirstNameCount DESC 
+0

Просто любопытно - почему вы не можете использовать 'TOP'? Это именно то, что предназначено для «TOP» - ограничить результат на X количество строк. – dotnetom

+0

Поскольку вопросник не позволяет мне – BobSacamano

+1

Вы смешиваете анны и орлы, см. [Приоритет оператора] (https://msdn.microsoft.com/en-us/library/ms190276.aspx). Либо используйте 'in', чтобы перечислить StateProvinceIDs или поместите в него круглые скобки. –

ответ

1

Добавьте следующую строку в конце запроса:

-- << the query you have here 
OFFSET 0 ROWS FETCH NEXT 1 ROWS ONLY; 
0

Я думаю, что проблема заключается в предложении WHERE.

Если вы добавите круглые скобки, вы должны получить лучший набор результатов, т.е.

WHERE 
PAT.AddressTypeID = 2 AND 
(StateProvinceID = 50 OR 
StateProvinceID = 64 OR 
StateProvinceID = 66 OR 
StateProvinceID = 71 OR 
StateProvinceID = 77) 

или даже лучше было бы использовать в т

WHERE PAT.AddressTypeID = 2 AND StateProvinceID IN (50,64,66,71,77) 

, и я думаю, что предел показывает только первую строку может быть достижимо, используя что-то вроде MAX (COUNT (*))