访问版本2000& 2013 SQL拉最新日期,MAX不起作用

时间:2016-09-29 06:37:06

标签: date ms-access

我有一张表需要从不同的类别中提取最新日期,并且日期可能并不总是填写完整。我试过使用MAX,MIN等它没有用。

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])

提前感谢您的所有帮助

2 个答案:

答案 0 :(得分:0)

使用Nz功能:

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的序列(你似乎称之为一个类别)。

答案 1 :(得分:-1)

如果您在编写简单查询(SQL DML)时遇到问题,那么您应该考虑可能存在设计缺陷(在SQL DDL中)。

缺少的值导致您避免使用MAX set函数并强制您处理查询中的空值(请注意NZ()函数将导致Access UI之外的错误)。通过简单地不向表中添加行来更好地建模缺失数据。想一想:你想要数据库中可能的最小数据量,你可以推断其余数据,例如:如果乔没有在1月1日和1月2日以及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)。