2017-02-13 146 views
0

我正在嘗試在MS ACCESS表上創建某種有效性(日期範圍)字段。它將需要按ID,主題和級別分組來得出每條記錄的有效期。如果沒有采取相應的測試來提高成績,則截至目前的有效期限將設置爲99年12月31日。MS Access 2016中的SQL Server LEAD等效函數

我現在有如下表:

ID | Subject | Level | FromGrade | ToGrade | TestDate 
101 | Math | 5 | C+  | D  | 31/11/2016 
101 | Math | 4 | D   | A  | 01/12/2016 
101 | Math | 5 | D   | B+  | 12/12/2016 
101 | Math | 5 | B+  | A  | 25/12/2016 
102 | English | 4 | B   | B  | 20/12/2016 
102 | English | 4 | B   | C  | 28/12/2016 

結果表我應該得到以下的結尾:

ID | Subject | Level | FromGrade | ToGrade | TestDate | EffectiveTo 
101 | Math | 5 | C+  | D  | 31/11/2016 | 11/12/2016 
101 | Math | 4 | D   | A  | 01/12/2016 | 31/12/9999 
101 | Math | 5 | D   | B+  | 12/12/2016 | 24/12/2016 
101 | Math | 5 | B+  | A  | 25/12/2016 | 31/12/9999 
102 | English | 4 | B   | B  | 20/12/2016 | 27/12/2016 
102 | English | 4 | B   | C  | 28/12/2016 | 31/12/9999 

在SQL Server中做到這一點,我可以很容易地使用LEAD OVER功能:

SELECT [ID] 
, [Subject] 
, [Level] 
, [FromGrade] 
, [ToGrade] 
, [TestDate] 
, [EffectiveTo] = LEAD([TestDate], 1) OVER (PARTITION BY [ID], [Subject], [Level] ORDER BY [TestDate]) 
into StudentTable2 
FROM [dbo].[StudentTable1] 
ORDER BY [ID], [Subject], [Level], [TestDate] 

然後跟着一個

update [dbo].StudentTable2set [EffectiveTo] = DATEADD("DAY", -1, [EffectiveTo]) where EffectiveTo is not null 

但是,這是不是在MS Access/VBA腳本工作,有沒有其他方式可以實現相同的結果?

+0

爲什麼不使用MS Access pass-thru查詢保留準確的SQL Server查詢?此外,這裏沒有VBA。 – Parfait

回答

1

您可以使用相關的子查詢。要獲取MS Access中的下一個值:

SELECT st.*, 
     (SELECT MIN(st2.TestDate) 
     FROM dbo.StudentTable1 as st2 
     WHERE st2.ID = st.ID AND 
       st2.Subject = st.Subject AND 
       st2.[Level] = st.[Level] AND 
       st2.TestDate > st.TestDate 
     ) as EffectiveTo 
FROM dbo.StudentTable1 as st 
ORDER BY [ID], [Subject], [Level], [TestDate]; 
+0

這將返回一個錯誤「您已經編寫了一個子查詢,它可以在不使用主查詢的FROM子句中的EXISTS保留字的情況下返回多個字段,修改子查詢的SELECT語句以僅請求一個字段」 – user1688194

+0

@ user1688194。 。 。糟糕,應該是'MIN(TestDate)'。 –

+0

現在查詢返回錯誤代碼「您的查詢不包含指定表達式'TestDate'作爲聚合函數的一部分 – user1688194