2016-05-18 74 views
0

我正在尝试使用MAX()函数作为子查询来过滤整个过去几年我的更大查询的结果。我意识到这比我最初认为需要的复杂一点,所以我创建了一个更简单的查询来测试我需要使用HAVING子句做些什么,以便使其工作。SQL- 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 
+1

为什么不使用Where语句呢? –

回答

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

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

下面是使用window functions一个选项:

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

我不认为有必要在这里既可以使用convert功能,但如果你需要,你可以将其重新添加。

+0

感谢您的解释! – plankton