2010-12-23 16 views
0

Ich habe eine Summenabfrage (eine, wo ich auf die Summen-Schaltfläche geklickt hat, und es hat "gruppieren nach" Spalten) in Access 2007. Die meisten Spalten sind in Ordnung ... gruppieren Sie nach Spalten, Max Spalten, Min Spalten, etc. Für einige von ihnen möchte ich nur den letzten nicht leeren (nicht "" oder Null) Wert einer String-Spalte extrahieren."Summen" Abfrage: zeigen letzte nicht leere Zeichenfolge

Hier ist ein Beispiel, was meine SQL wie folgt aussieht:

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 

Der Ausdruck hervorgehoben derjenige ist, ich auf den letzten nicht leeren Feld zu ändern möchten. Gibt es einen Access-spezifischen oder einfachen SQL-Ausdruck, der dies tut?

Edit: Es stellte sich heraus, dass Min() und Max() Arbeit auf String-Werte und Nullwerte ignoriert, in alphabetischer Reihenfolge die ersten und letzten Werte nehmen. Es ist nicht perfekt, weil es nicht garantiert, dass der ausgewählte Wert der letzte ist, aber es ist besser als nur eine Last von Nullen, die Verwendung von Last() geben könnte.

+4

Was wirklich bedeutet das dauern? Es impliziert eine Ordnung - etwas, das eine Tabelle nicht garantiert. Mit "last" müssen Sie also explizit die Reihenfolge einiger Spalten in Ihrer Tabelle angeben. Sagen wir zum Beispiel, die Spalte, nach der Sie bestellen möchten, heißt "entrytime", Sie könnten dann "max (entrytime) von DupStu wählen, wobei UcasNumber nicht null ist", um den "Schlüssel" für den letzten Eintrag herauszufinden - natürlich Wenn zwei Datensätze denselben "Schlüssel" teilen, funktioniert das nicht ... –

+0

@John Danke für die Rückmeldung. Ich bin mir nicht sicher, wie ich die Datensätze für eine Gruppe gruppieren soll, aber das scheint keine Rolle zu spielen, da sie standardmäßig nach dem automatisch inkrementierten Primärschlüssel geordnet sind, der sie in der Reihenfolge ihrer Erstellung anordnet . Das ist also wirklich ein Nebenproblem. –

+0

Mein Kommentar war nur der erste Schritt - im Grunde, wenn Sie einen eindeutigen Schlüssel für Ihre letzte Bestellung definieren können, dann können Sie dies in einer Unterabfrage verwenden, aus der Ihre 'Gruppe von 'auswählen wird. Leider kenne ich die SQL-Dialekte von Access in dieser Hinsicht nicht. –

Antwort

0

Der Zugriff scheint resistent gegen die Idee der Rückgabe des letzten Nicht-Null-Werts in einer Abfrage mit GROUP BY. Selbst wenn Ihre FROM-Klausel geändert wurden so etwas wie

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

und der Rest Ihrer Abfrage modifiziert wurden als SortedDuplicates zu verwenden, anstatt, greift nicht auf den letzten Wert erscheinen in der Reihenfolge an zurückzukehren, die Sie angeben. Ich testete in einer Tabelle mit genau einer leeren Zeile und bestimmten Ordnungen, die ich überprüfen konnte (sowohl ein automatisch erhöhtes Feld als auch einen Wert, den ich mit Min und Max überprüft hatte), und Access wählte einen anderen Wert als Letzter.

+0

Right - First/Last sind von ORDER BY überhaupt nicht betroffen (ich dachte, sie wären es und erst kürzlich entdeckt, dass sie es nicht sind). Ich benutze First/Last überhaupt nicht, gerade weil ich sie unvorhersehbar finde und nicht wirklich an brauchbare Anwendungen für sie denken kann (wann genau stelle ich fest, dass ich de facto Zufallsdaten präsentieren möchte?). –

0

Basierend auf Ihrem Kommentar scheint es, wie Ihre Definition von „Last“ ist: der zuletzt hinzugefügten Datensatz auf der Grundlage einer mit automatischer Erhöhung ID. In diesem Sinne sollte eine gewisse Form der folgenden Arbeit (es eine Unterabfrage verwendet die neueste nicht-null UcasNumber zurückzukehren):

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 
Verwandte Themen