Date accessversion2000&;2013 SQL pull最新日期,MAX不';行不通
我有一个表格,需要从不同的类别中提取最新的日期,并且该日期可能并不总是被填写。我已经尝试使用最大值、最小值等。它不起作用Date accessversion2000&;2013 SQL pull最新日期,MAX不';行不通,date,ms-access,Date,Ms Access,我有一个表格,需要从不同的类别中提取最新的日期,并且该日期可能并不总是被填写。我已经尝试使用最大值、最小值等。它不起作用 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
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])
非常感谢您的帮助使用新西兰功能:
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的序列(您似乎称之为一个类别)。
< P>当您编写应该是简单查询的问题时(SQL DML),那么您应该考虑到可能存在设计缺陷(在SQL DDL中)。 缺少的值导致您避免使用MAX
set函数,并迫使您在查询中处理空值(注意NZ()
函数将导致Access UI之外的错误)。最好通过不向表中添加行来建模缺失的数据。想一想:你想要数据库中尽可能少的数据,你可以推断出剩余的数据,例如,如果Joe没有在1月1日、1月2日、1月3日和1月4日等进行游戏,那么就不要为所有这些日期向你的数据库添加任何内容
以下SQL DDL需要ANSI-92查询模式(但您可以使用Access GUI工具创建相同的表/视图):
若要查找玩家缺少的序列值,请创建一个包含所有可能序列号的表
{1,2,3}
,您可以“反加入”(例如不存在)。非常感谢Nz函数工作得非常好;)如果你对我的回答竖起大拇指,我将不胜感激。
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 );