2010-12-23 54 views
0

在Access 2007中,我有一个总计查询(其中我点击了总计按钮,并且它具有“group by”列)。大多数列都很好...按列,最大列,最小列等分组。对于其中的一些,我想只提取字符串列的最后一个非空(非“或空值)值。“Totals”查询:显示最后一个非空字符串

这里是什么我的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()可能给出的空值负载要好。

+4

最后的真正含义是什么?它意味着一种排序 - 这是表格不能保证的。因此,通过“最后”您明确需要指定表中某些列的排序。比如说,你想要订购的那一列叫做“入门时间”,然后你可以从DupStu中选择max(入门时间),其中UcasNumber不为空,以找出最后一个入口的“关键字” - 当然如果两个记录共享相同的“密钥”,这是行不通的... – 2010-12-23 09:50:39

+0

@John感谢您的反馈意见。我不知道如何为'group by'排序记录,但它似乎并不重要,因为它们默认情况下是通过自动递增主键排序的,这使得它们按创建时的顺序排列。所以这真是一个问题。 – 2010-12-23 09:54:16

回答

0

访问似乎对使用GROUP BY返回查询中最后一个非空值的想法有抵触。即使你的FROM子句进行了修改,是这样的

FROM (
    SELECT allfieldsyouneed 
    FROM DuplicateStudents 
    ORDER BY PlannedStart 
) AS SortedDuplicates 

和您的查询的其余部分进行了修改,使用SortedDuplicates代替,访问似乎并没有返回基于您指定的顺序上的最后一个值。我在一张表上测试了一行空白行和我可以验证的特定订单(包括一个自动递增字段和一个使用Min和Max检查的值),并且Access选择返回其他一些值作为Last。

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 
相关问题