SQL-HAVING子句问题

时间:2016-05-18 16:58:20

标签: sql sql-server having having-clause

我正在尝试使用MAX()函数作为子查询来过滤整个过去几年中我的更大查询的结果。我意识到这比我最初想象的要复杂一点,所以我创建了一个更简单的查询来测试我需要用HAVING子句做什么才能让它工作。

我已经检查了这两个帖子,但它没有真正帮助(SQL, HAVING clause explainedSQL: HAVING clause

我不认为我对HAVING条款的理解是正确的,因为我不确定为什么它不起作用。有人能帮忙解释一下吗?

注意:[Fiscal Year]NVARCHAR,因此我认为将其转换为INT可能会有效。

SELECT DISTINCT

D.[FISCAL YEAR]

FROM [Dates] AS D

GROUP BY D.[Fiscal Year]

HAVING CONVERT(INT,D.[Fiscal Year]) >= MAX(CONVERT(INT,D.[FISCAL YEAR])) -2

这些是我的结果:

(No column name)
2015
2014
2013
2012
2016

这些是我应该得到的结果:

(No column name)
2015
2014
2016

2 个答案:

答案 0 :(得分:2)

我认为这可以在WHERE子句中做得更好。这个解决方案并不是最优的,但是你可以做到这一点。

SELECT 
      DISTINCT D.[FISCAL YEAR]
FROM [Dates] AS D
      WHERE CONVERT(INT,d.[Fiscal Year]) 
             >= (SELECT MAX(CONVERT(INT,[Fiscal Year])) -2 from Dates)

答案 1 :(得分:1)

您遇到的问题是您按年份进行分组,因此最大值将始终与该组的年份相同。

以下是使用window functions的一个选项:

select distinct fiscalyear 
from (
    select fiscalyear, max(fiscalyear) over () maxfiscalyear
    from dates 
) t 
where fiscalyear >= maxfiscalyear - 2

我也不认为这里需要使用convert功能,但如果需要,可以将其添加回来。