“Totals”查询:显示最后一个非空字符串

时间:2010-12-23 09:20:08

标签: sql ms-access

我在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()可能给出的空值加载更好。

2 个答案:

答案 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