PDA

Vollständige Version anzeigen : Vorletzter Datensatz ermitteln


danny007
12.07.2006, 10:40
Hi,
wie kann ich in einer Abfrage die 2 letzten Datensätze eines zuvor gruppierten Feldnamen ermitteln. Wobei nur die Datensätze ausgewiesen werden mit deren Differenz vom ersten zum vorletzten Datensatz.

Gruß danny

Mein bisheriger Ansatz:

SELECT A_KABI.NR, A_KABI.DATUM
FROM A_KABI
WHERE (((A_KABI.NR) In (SELECT top 2 NR FROM A_KABI)))
GROUP BY A_KABI.NR, A_KABI.DATUM;

Urdaten:
Nr Datum
001 16.02.06
001 15.03.06
001 18.04.06
002 17.02.06
002 16.06.06
002 18.10.06
003 16.04.06
003 16.05.06
003 16.08.06
003 16.12.06

gewünschtes Ergebnis
Nr letztes Datum vorletztes Datum Differenz letzt. Dat. zu vorletztem 001 18.04.06 15.03.06 20 Tage
002 18.10.06 16.06.06 25 Tage
003 18.04.06 15.03.06 30 Tage

usw.

J_Eilers
12.07.2006, 12:07
Hi,

so ganz versteh ich das gerade noch nicht, deswegen gibts erstmal ne Abfrage anhand dessen Ergebnis man weiterargumentieren kann:

SELECT
Nr,
Max([Datum]) As letztesDatum
(SELECT Max([Datum]) FRM A_KABI As Q WHERE Q.[Datum] < A_KABI.[Datum]) As vorletztesDatum
FROM
A_KABI
GROUP BY
Nr

danny007
12.07.2006, 14:32
Hallo Jan,
leider erhalte ich hierzu folgende Fehlermeldung:

Die Select Anweisung schliest ein reserviertes Wort oder einen Argumentnamen ein, der mit falscher Zeichensetzung oder überhaupt nicht eingegeben wurde!

Gruß Danny

J_Eilers
12.07.2006, 14:57
Da hab ich ein Komma vergessen. Vielleicht gehts ja so?

SELECT
Nr,
Max([Datum]) As letztesDatum,
(SELECT Max([Datum]) FRM A_KABI As Q WHERE Q.[Datum] < A_KABI.[Datum]) As vorletztesDatum
FROM
A_KABI
GROUP BY
Nr

Anne Berg
12.07.2006, 14:58
Hi, da fehlt ein Komma hinter letztesDatum.

danny007
12.07.2006, 15:01
Hi Jan,

Syntaxfehler in Abfrageausdruck???

bei Frm durch From ersetzt.

Leider aber jetzt immer noch

Sie wollten eine Abfrage ausführen die den angegebenen Ausdruck 'Datum' nicht als Teil der Aggregatfunktion einschliest!

Gruß Danny

J_Eilers
12.07.2006, 15:06
Tut mir leid, bin grad nicht wirklich bei der Sache:

(SELECT Max([Datum]) FROM A_KABI As Q WHERE Q.[Datum] < A_KABI.[Datum]) As vorletztesDatum

danny007
12.07.2006, 15:10
Hi Jan,

Leider aber jetzt immer noch

Sie wollten eine Abfrage ausführen die den angegebenen Ausdruck 'Datum' nicht als Teil der Aggregatfunktion einschliest!

Gruß Danny

J_Eilers
12.07.2006, 15:18
Das kann eigentlich nicht sein. Kannst du eine Miniversion hochladen? Würds mir dann morgen anschauen.

danny007
13.07.2006, 07:48
Hallo Jan,
hier die gewünschte Mini-Version

Gruß Danny

J_Eilers
13.07.2006, 09:13
Die Abfrage dauert etwas, aber es geht mir erstmal nur um das Ergebnis:

SELECT
PMNR,
Max(DATUM) AS MaxDATUM,
(SELECT Max(Datum) FROM Kali AS q WHERE q.Datum <
(SELECT Max(Datum) FROM Kali AS q WHERE q.PMNR = Kali.PMNR)) AS vorletztes
FROM
Kali
GROUP BY
PMNR;

danny007
13.07.2006, 09:26
Hi Jan,
bei PMNR 10
das letzte Datum wäre richtig 03.02.06
das vorletzte Datum wäre richtig 27.01.03

bei PMNR 100
das letzte Datum wäre richtig 13.12.01
das vorletzte Datum wäre richtig null oder fehlt

bei PMNR 100001
das letzte Datum wäre richtig 05.08.05
das vorletzte Datum wäre richtig 12.06.02

Anmerkung: Das Feld Datum sollte innerhalb des Feld bzw. Gruppe PMNR sortiert sein!
Danny

J_Eilers
13.07.2006, 10:05
Folgende Abfrage:

SELECT Kali.PMNR, Last(Kali.DATUM) AS Letzter, getdate((SELECT Last(DATUM) FROM Kali As q WHERE q.PMNR = Kali.PMNR),[pmnr]) AS Vorletzter
FROM Kali
GROUP BY Kali.PMNR;


Und dann ein neues Modul mit folgendem Code:

Function GetDate(LDate As Date, PMNR As String)
Dim strSQL As String
Dim rs As New ADODB.Recordset

strSQL = "SELECT TOP 1 Datum FROM Kali WHERE PMNR = '" & PMNR & "' "
strSQL = strSQL & "ORDER BY Datum DESC"

With rs
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open strSQL

If .EOF Or .BOF Or .Fields(0) = LDate Then
GetDate = Null
Else
GetDate = .Fields(0)
End If
End With

rs.Close: Set rs = Nothing
End Function

Speichern unter mdlGetDate.

danny007
13.07.2006, 10:18
Hi Jan,

PMNR Letzter Vorletzter
100003 22.05.06 30.08.05

richtig:
PMNR Letzter Vorletzter
100003 22.05.06 23.01.06

Danny

J_Eilers
13.07.2006, 10:46
Jetzt weiß ich auch endlich, warum mir das so komisch erscheint...kannst du das Datum auf Tabellenebene in ein Datum umwandeln oder muss es als Text bestehen bleiben?

danny007
13.07.2006, 10:55
Hi Jan,

habe das Datum umgewandelt von Typ- Text nach Typ-Datum/Uhrzeit. Leider immer noch der gleiche Fehler.

PMNR Letzter Vorletzter
100003 26.11.2003 22.05.2006

richtig:
PMNR Letzter Vorletzter
100003 22.05.06 23.01.06

Danny

J_Eilers
13.07.2006, 11:20
Jepp, aber dafür klappts mit folgender Abfrage/Code. Denn damit ist Max auch Max und nicht eine Zeichenfolge ;)

SELECT
PMNR,
Max(DATUM) AS Letzter,
getdate((SELECT Last(DATUM) FROM Kali As q WHERE q.PMNR = Kali.PMNR),[pmnr]) AS Vorletzter,
DateDiff("d",getdate((SELECT Last(DATUM) FROM Kali As q WHERE q.PMNR = Kali.PMNR),[pmnr]),Last([Datum])) AS Differenz
FROM Kali
GROUP BY PMNR

Function GetDate(LDate As Date, PMNR As String)
Dim strSQL As String
Dim rs As New ADODB.Recordset

strSQL = "SELECT Max(Datum) FROM Kali WHERE DATUM < " & Format(LDate, "\#yyyy\-mm\-dd\#") & " AND PMNR = '" & PMNR & "' "

With rs
.ActiveConnection = CurrentProject.Connection
.CursorType = adOpenForwardOnly
.LockType = adLockReadOnly
.Open strSQL

If .EOF Or .BOF Then
GetDate = Null
Else
GetDate = .Fields(0)
End If
End With

rs.Close: Set rs = Nothing
End Function

danny007
13.07.2006, 12:05
Hi Jan,
leider ist das Ergebnis bei "100003" so nicht richtig!

PMNR Letzter Vorletzter Differenz
100003 22.05.2006 19.08.2003 99

Richtig wäre
PMNR Letzter Vorletzter Differenz
100003 22.05.06 23.01.06

Gruß Danny

J_Eilers
13.07.2006, 12:10
Bei mir kommt genau das aber raus:

PMNR Letzter Vorletzter Differenz
100003 22.05.2006 23.01.2006 119

danny007
13.07.2006, 12:17
Hi Eilers,
nach dem ich in die Tabelle ein Autowert und einen Primärschlüssel über die Felder Autowert, PMNR und Datum gelegt habe funktioniert es auch bei mir.

Könntest Du mir mal deine DB hochladen?

Gruß Danny

Nouba
13.07.2006, 12:19
Hallo,

wenn Du nur jeweils den jüngsten Datensatz je Prüfmittel und die Differenz in Tagen zum Vorgänger brauchst, kannst Du diese Abfrage verwenden (ein Datumsfeld wird vorausgesetzt).
<font color="#0000ff"><b>SELECT</b></font> K.LFDNR, K.PMNR, K.BENENNUNG, K.DATUM,
DateDiff(<font color="#ff0000">"d"</font>, Nz(
(<font color="#0000ff"><b>SELECT</b></font> TOP 1 DATUM <font color="#0000ff"><b>FROM</b></font> Kali
<font color="#0000ff"><b>WHERE</b></font> PMNR = K.PMNR
<font color="#0000ff"><b>AND</b></font> LFDNR &lt; K.LFDNR
<font color="#0000ff"><b>ORDER</b></font> <font color="#0000ff"><b>BY</b></font> LFDNR <font color="#0000ff"><b>DESC</b></font>), [DATUM]),
[DATUM]) <font color="#0000ff"><b>AS</b></font> TAGE,
K.Status
<font color="#0000ff"><b>FROM</b></font> Kali <font color="#0000ff"><b>AS</b></font> K
<font color="#0000ff"><b>WHERE</b></font> K.DATUM = ( <font color="#0000ff"><b>SELECT</b></font> <font color="#cd00cd"><u>Max</u></font>(DATUM) <font color="#0000ff"><b>FROM</b></font> Kali <font color="#0000ff"><b>WHERE</b></font> PMNR = K.PMNR);

J_Eilers
13.07.2006, 12:31
Hier ist sie

danny007
13.07.2006, 12:40
Hi Jan,
da ich meine Tabelle neu sortiert habe und zum Test die Daten komplett gelöscht und wieder neu eingefügt habe, hatte bei mir dein Code Jan erst nach dem einfügen eines Primärschlüssel über die Felder Autowert, PMNR und Datum mit Sortierung, wieder die richtigen Ergebnisse gebracht.

hi Nouba,
wie kann ich mir jetzt noch die Werte des vorletzten Datum des Prüfmittel anzeigen lassen - analog Jan?

Recht herzlichen Dank euch beide.
Mal wieder unschlagbar - hätte das alleine sicherlich nicht hinbekommen?

Viele Grüße Danny

Nouba
13.07.2006, 13:30
Hallo,

wenn der vorletzte Status interessiert, ermittle ihn genauso wie das vorletzte Datum in der Unterabfrage innerhalb der DateDiff-Funktion. Dazu ist vermutlich das Memofeld in ein Textfeld umzuwandeln. Hier folgt der Abschnitt der Unterabfrage.
(SELECT TOP 1 Status FROM Kali
WHERE PMNR = K.PMNR
AND LFDNR < K.LFDNR
ORDER BY LFDNR DESC) AS LETZTER_STATUS

PS: Mit dem Datum kannst Du analog verfahren.