2016-10-30 7 views
-1

Ich muss den häufigsten Kunden Vornamen aller Kunden finden, deren Heimatadresse in Australien ist, unter Verwendung der AdventureWorks Datenbank (https://technet.microsoft.com/en-us/library/ms124438(v=sql.100).aspx).Abrufen des maximalen Wertes von einer Abfrage

Der Code, den ich unten habe, gibt mir die Antwort, die ich brauche ("Lacey" verwendet 25 Mal), aber es ergibt 561 Reihen. Wie kann ich dies auf 1 Zeile ohne mit TOP x oder SET ROWCOUNT beschränken, um Ergebnisse zu manipulieren?

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

Nur neugierig - warum kannst du 'TOP' nicht benutzen? Dies ist speziell, was "TOP" zu tun ist - begrenzen Sie das Ergebnis auf X Anzahl der Zeilen. – dotnetom

+0

Da der Fragesteller mir nicht erlaubt – BobSacamano

+1

Sie mischen Ands und Ors, siehe [Operator Vorrang] (https://msdn.microsoft.com/en-us/library/ms190276.aspx). Verwenden Sie entweder 'in', um StateProvinceIDs aufzulisten, oder setzen Sie Klammern um sie. –

Antwort

1

die folgenden am Ende der Abfrage hinzufügen:

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

ich glaube, das Problem in der WHERE-Klausel ist.

Wenn Sie Klammern hinzufügen, sollten Sie eine bessere Ergebnismenge erhalten, dh.

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

oder noch besser wäre in dh

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

zu benutzen, und ich denke, die Grenze nur die erste Zeile zeigt möglicherweise erreichbar etwas wie MAX verwenden werden (COUNT (*))

Verwandte Themen