2012-12-06 34 views
3

我正在使用测试数据库Advetureworks,并且想要获得结果中第二高的计数,但我没有得到它。我必须得到查询结果中的第二大计数

我必须对以下查询进行哪些更改以获得所需的结果?

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 

回答

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 
+0

我我道歉提前,因为我知道它的一个愚蠢的问题....但我想知道如果我能group by子句中使用“*”与否,而不是写作由cla分组中的所有列名称使用/ – faizan

+0

这不是一个愚蠢的问题......在查询的'SELECT'列表中,您可以只放置那些在GROUP BY子句或聚合列中的列,即由某些聚合函数生成的列作为'COUNT(),SUM(),AVG()'等。否则你会得到一个编译错误。 –

+0

感谢您回答......另外一件事......我如何联系您以获取更多疑问......? – faizan

4

我知道有这样做的发表伊万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 
+0

感谢您提供您的意见.......我真的很感激它,它给了我一个使用“顶”和“行”功能的新视角 – faizan

+0

是否有任何其他方式添加列名称组子句,而不是单独命名它们? – faizan

+0

没问题。但是,不,你必须在group by子句中命名列。从MSDN [http://msdn.microsoft.com/en-us/library/ms177673(v=SQL.105).aspx]:“