2016-09-29 43 views
0

我有一個表,需要拉不同類別的最新日期和日期可能不會總是填寫。我試圖使用MAX,MIN等它沒有工作。訪問版本2000年和2013年SQL拉最新日期,MAX不起作用

e.g. ID 1st Game Date 2nd Game Date 3rd Game Date 
    Joe  6/1/16   missing  missing 
    Anna  missing  7/2/16  7/6/16 
    Rita  missing  7/31/16  missing 

需要返回:

ID  Date 
    Joe  6/1/16 
    Anna  7/6/16 
    Rita  7/31/16 

我確實有這個SQL的作品很好,但它要求所有的日期得到填補在其他明智它不返回的最後日期:

ApptDate: Switch([Pt1stApptDate]>=[2ndApptDate] And [Pt1stApptDate]>= 
[3rdApptDate],[Pt1stApptDate],[2ndApptDate]>=[Pt1stApptDate] And [2ndApptDate]>= 
[3rdApptDate],[2ndApptDate],[3rdApptDate]>=[Pt1stApptDate] And [3rdApptDate]>= 
[2ndApptDate],[3rdApptDate]) 

提前爲您的幫助很大升值

回答

0

使用新西蘭功能:

ApptDate: Switch(Nz([Pt1stApptDate],0)>=Nz([2ndApptDate],0) And 
Nz([Pt1stApptDate],0)>= Nz([3rdApptDate],0), Nz([Pt1stApptDate],0), 
Nz([2ndApptDate],0)>=Nz([Pt1stApptDate],0) And Nz([2ndApptDate],0)>= 
Nz([3rdApptDate],0),Nz([2ndApptDate],0), 
Nz([3rdApptDate],0)>=Nz([Pt1stApptDate],0) And Nz([3rdApptDate],0)>= 
Nz([2ndApptDate],0),Nz([3rdApptDate],0)) 

話雖如此,你的餐桌設計是不正確的。 你應該存儲在單獨的行每ID每ApptDate:

ApptID ID ApptDate ApptNr 
1 Joe  6/1/2016 1 
2 Anna 7/2/2016 2 
3 Anna 7/6/2016 3 
4 Rita 7/31/2016 2 

而ApptID是一個自動編號和ApptNr是每個ID序列(你好像叫什麼類別)。

+0

謝謝soooo Nz功能完美工作;) – Ella

+0

豎起大拇指爲我的答案將不勝感激。 – Rene

+0

2 Big Thumbs Up !!!!! – Ella

-1

當您在編寫簡單查詢(SQL DML)時遇到問題時,您應該考慮您可能有設計缺陷(在您的SQL DDL中)。

缺少的值會導致您避開MAX設置函數並迫使您處理查詢中的空值(請注意NZ()函數會導致Access UI以外的錯誤)。通過簡單地不向表格添加行來更好地建模缺失數據。考慮一下:你想在你的數據庫中儘可能少的數據,你可以推斷例如如果喬在1月1日和2月1日以及1月3日和1月4日不玩遊戲,那麼在所有這些日期之前,不要在數據庫中添加任何內容。

下面的SQL DDL需要ANSI-92查詢模式(但您可以創建使用Access GUI工具相同的表/視圖):

CREATE TABLE Attendance 
(gamer_name VARCHAR(35) NOT NULL REFERENCES Gamers (gamer_name), 
    game_sequence NOT NULL CHECK (game_sequence BETWEEN 1 AND 3) 
    game_date DATETIME NOT NULL, 
    UNIQUE (game_date, game_sequence)); 


INSERT INTO Attendance VALUES ('Joe', 1, '2016-06-01'); 
INSERT INTO Attendance VALUES ('Anna', 2, '2016-07-02'); 
INSERT INTO Attendance VALUES ('Anna', 3, '2016-07-06'); 
INSERT INTO Attendance VALUES ('Rita', 1, '2016-07-31'); 


CREATE VIEW MostRecentAttendance 
AS 
SELECT gamer_name, MAX (game_date) AS game_date 
    FROM Attendance 
GROUP 
    BY gamer_name; 


SELECT * 
    FROM Attendance a 
WHERE EXISTS (SELECT * 
        FROM MostRecentAttendance r 
       WHERE r.gamer_name = a.gamer_name 
         AND r.game_date = a.game_date); 

要查找玩家丟失的序列值,創建一個表所有可能的序列號{ 1, 2, 3 },你可以'反加入'(例如NOT EXISTS)。