2016-05-18 111 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