如何在SQL Server表

时间:2017-07-20 02:29:30

标签: sql sql-server tsql having having-clause

我在SQL Server的MigratoryBirds表中的数据

birdType
1
4
4
4
5
5
5
3

用于创建上表的SQL脚本:

/****** Object:  Table [dbo].[migratoryBirds]    Script Date: 20-Jul-17 8:01:02 AM ******/
SET ANSI_NULLS ON
GO

SET QUOTED_IDENTIFIER ON
GO

CREATE TABLE [dbo].[migratoryBirds](
    [birdType] [int] NULL
) ON [PRIMARY]

GO

我的目标是获得表中频率最高的鸟类。如果我编写存储过程并可以自由编写多个SQL查询,那么这并不困难,但我正在尝试使用单个SQL查询来实现它。我正在尝试查看SQL服务器的Having子句是否对我有任何帮助。

所以我写的第一个查询是:

select birdType, count(1) AS [birdCount]
from migratorybirds
group by birdType

给出了以下输出

birdType birdCount
1        1
3        1
4        3
5        3

由于这是聚合的情况,所以我认为Having子句可以帮助我过滤掉频率最高3的记录。 birdType 4和5的频率最高为3。

所以,我增强了我的查询:

select birdType, count(1) AS [birdCount]
from migratorybirds
group by birdType
having count(1) > Max(count(1))

,它给出了以下错误:

  

消息130,级别15,状态1,行18无法执行聚合   对包含聚合或子查询的表达式起作用。

任何人都可以帮我实现同样的目标吗?

2 个答案:

答案 0 :(得分:5)

在SQL Server中,您可以使用top (1) with ties

select top (1) with ties birdType, count(1) AS birdCount
from migratorybirds
group by birdType
order by count(1) desc;

答案 1 :(得分:0)

在实践中,我可能会选择戈登的答案,但如果您想继续使用当前的方法,可以尝试以下方法:

WITH cte AS (
    SELECT birdType, COUNT(1) AS [birdCount]
    FROM migratorybirds
    GROUP BY birdType
)

SELECT *
FROM cte
WHERE birdCount = (SELECT MAX(birdCount) FROM cte)

如果要以这种方式使用WHERE,则需要MAX子句中的实际子查询。请注意,此解决方案需要两个查询,而戈登的答案只需要一个。