3

Advetureworks のテスト データベースを使用しており、結果で 2 番目に高いカウントを取得したいのですが、取得できません。

目的の結果を得るには、次のクエリにどのような変更を加える必要がありますか?

select pa.City,psp.Name,COUNT(he.EmployeeID) as emp_count
from HumanResources.EmployeeAddress hea
join HumanResources.Employee he on he.EmployeeID=hea.EmployeeID
join Person.Contact pc on pc.ContactID=he.ContactID
join Person.Address pa on pa.AddressID=hea.AddressID
join Person.StateProvince psp on psp.StateProvinceID=pa.StateProvinceID
where COUNT(he.EmployeeID) < (select max(count(he.employeeid)) from HumanResources.Employee)

group by pa.City,psp.Name
4

2 に答える 2

5

ランキング関数を使用できます。次のように試してください。

;WITH a AS (
    select pa.City,psp.Name,COUNT(he.EmployeeID) as emp_count
    from HumanResources.EmployeeAddress hea
    join HumanResources.Employee he on he.EmployeeID=hea.EmployeeID
    join Person.Contact pc on pc.ContactID=he.ContactID
    join Person.Address pa on pa.AddressID=hea.AddressID
    join Person.StateProvince psp on psp.StateProvinceID=pa.StateProvinceID
    group by pa.City,psp.Name   
), b AS (
    SELECT  *,
            ROW_NUMBER() OVER (ORDER BY emp_count DESC) num
    FROM    a
)
SELECT  *
FROM    b
WHERE   b.num = 2
于 2012-12-06T08:37:36.427 に答える
4

Ivan Gによって投稿されたように、ROW_NUMBERの方法があることは知っていましたが、構文を思い出せないため、少し異なるアプローチを使用します。

with top_cities (City, Name, emp_count) as
(
  select top 2
    pa.City,psp.Name,COUNT(he.EmployeeID) as emp_count
  from 
    HumanResources.EmployeeAddress hea
    join HumanResources.Employee he on he.EmployeeID=hea.EmployeeID
    join Person.Contact pc on pc.ContactID=he.ContactID
    join Person.Address pa on pa.AddressID=hea.AddressID
    join Person.StateProvince psp on psp.StateProvinceID=pa.StateProvinceID        
  group by 
    pa.City,psp.Name
  order by 
    emp_count desc
)
select top 1 * from top_cities order by emp_count asc
于 2012-12-06T08:51:27.483 に答える