2010-12-23 77 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 
相關問題