2016-10-30 8 views
-1

AdventureWorksデータベース(https://technet.microsoft.com/en-us/library/ms124438(v=sql.100).aspx)を使用して、自宅の住所がオーストラリアにあるすべての顧客の最も一般的な顧客名を見つける必要があります。質問から最大値を取得

私が必要としている答え(「レーシー」は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

を許可しないため、andsとorsが混在しています。[operator precedence](https://msdn.microsoft.com/en-us/library/ms190276.aspx)を参照してください。 StateProvinceIDをリストするために 'in'を使うか、そのまわりにカッコを入れます。 –

答えて

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(*))のようなものを使用して達成できるかもしれないと思うだろうに

関連する問題