我有一张表需要从不同的类别中提取最新日期,并且日期可能并不总是填写完整。我试过使用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])
提前感谢您的所有帮助
答案 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
)。