我在Access 2007中有一个总计查询(我点击了总计按钮,并且它有“分组依据”列)。大多数列都很好...按列,最大列,最小列等等但是对于其中一些,我想只提取字符串列的最后一个非空(不是“”或“null”值。
以下是我的SQL的示例:
SELECT Min(Duplicates.AttendedODBefore) AS AttendedODBefore,
Min(Duplicates.ContactByPost) As ContactByPost,
Last(Duplicates.PlannedStart) As PlannedStart,
Min(Duplicates.AccessibilityRequirements) AS AccessibilityRequirements,
Last(Duplicates.UcasNumber) As UcasNumber
-- ^^^^
FROM DuplicateStudents As Duplicates
GROUP BY
Duplicates.ID
突出显示的表达式是我想要更改为最后一个非空白字段的表达式。是否存在特定于Access或纯SQL的表达式?
修改:结果Min()
和Max()
处理字符串值并忽略空值,按字母顺序排列第一个和最后一个值。它并不完美,因为它不能保证所选的值是最后一个,但它比使用Last()
可能给出的空值加载更好。
答案 0 :(得分:0)
Access似乎对使用GROUP BY返回查询中的最后一个非null值的想法有抵触。即使您的FROM子句被修改为类似
FROM (
SELECT allfieldsyouneed
FROM DuplicateStudents
ORDER BY PlannedStart
) AS SortedDuplicates
并且您的查询的其余部分被修改为使用SortedDuplicates,Access似乎不会根据您指定的顺序返回最后一个值。我在一个表上测试了一行空白行和我可以验证的特定订单(自动增量字段和我使用Min和Max检查的值),Access选择返回其他一些值作为Last。
答案 1 :(得分:0)
根据您的评论,似乎您对“上一个”的定义是:最近添加的记录,基于自动递增ID 。因此,以下某种形式应该有效(它使用子查询返回最新的非空UcasNumber
):
SELECT Min(Duplicates.AttendedODBefore) AS AttendedODBefore,
Min(Duplicates.ContactByPost) As ContactByPost,
Last(Duplicates.PlannedStart) As PlannedStart,
Min(Duplicates.AccessibilityRequirements) AS AccessibilityRequirements,
(SELECT TOP 1 D.UcasNumber FROM Duplicates AS D
WHERE D.UcasNumber Is Not Null
ORDER BY D.ID DESC) As UcasNumber
FROM DuplicateStudents As Duplicates