Hi,
ich brauche Hilfe bei einem Teil-Statement:
strSQL = "SELECT trkAuftragsnummer, " & _
"MAX(trkZeit) AS MaxZeit " & _
"FROM tblTrack " & _
"WHERE (trkZiel = 'MNZ' ) " & _
"GROUP BY trkAuftragsnummer;"
Die Auftragsnummer kommt mehrmals vor, jeweils mit unterschiedlichen Zeitstempeln und unterschiedlichen Zielen.
Ich brauche die Auftragsnummern , wo mit dem letzten (!) Zeitstempel das Ziel MNZ angegeben wurde.
Mit obigem Code erhalte ich den letzten Zeitstempel der Artikel, die irgendwann als Ziel MNZ hatten. Was muss ich ändern?
Hallo,
versuche mal so:
strSQL = "SELECT trkAuftragsnummer, " & _
"LAST(trkZeit) AS MaxZeit " & _
"FROM tblTrack " & _
"WHERE (trkZiel = 'MNZ' ) " & _
"GROUP BY trkAuftragsnummer;"
HTH
Hmmm... das Ergebnis ist leider das gleiche wie oben...
(Mit Zeitstempel meinte ich übrigens das Feld trkZeit)
Hallo,
und wenn du trkZeit aufsteigend sortierst?
"GROUP BY trkAuftragsnummer " & _
"ORDER BY Last(trkZeit);"
Auch nicht, wieder das selbe Resultat (wenn auch anders sortiert)
Ich hab mal ein Beispiel angehängt.
Aus der angehängten Minitabelle bräuchte ich z.B. den Auftrag 456 zurück. Mit meinem Code-Beispiel bekomme ich aber 123 UND 456 zurück.
[Anhang gelöscht durch Administrator]
Wenn Du nur ein Ergebnis haben willst, warum wird dann gruppiert ? ???
Zitat von: 69bruno am Februar 25, 2013, 14:52:45
Wenn Du nur ein Ergebnis haben willst, warum wird dann gruppiert ? ???
Die Original Tabelle ist schon ein wenig länger und die Abfrage komplexer. Ich habe hier nur das Kernproblem, das ich damit habe, extrahiert.
Hallo,
anhand deines Beispiels habe ich eine Tabelle erstellt und folgend abgefragt:
SELECT TOP 1 Last(Zeit) AS LetzterWertvonZeit, Ziel, Auftrag
FROM Tabelle1
GROUP BY Ziel, Auftrag
HAVING Ziel="MNZ"
ORDER BY Last(Zeit) DESC;
dies ergibt folgendes Ergebnis:
LetzterWertvonZeit Ziel Auftrag
22:10:00 MNZ 456
Das passt so noch nicht, ich fürchte ich kann mich nicht passend ausdrücken.
Ich hab noch ein erweitertes Beispiel angehängt.
Aus diesem Beispiel bräuchte ich folgende Datensätze zurück:
Auftrag: Zeit: Ziel:
456 22:20:00 MNZ
101 22:50:00 MNZ
Da pro Auftrag die jeweils letzte Zeit zu MNZ gehört.
[Anhang gelöscht durch Administrator]
Hallo,
ahhhh.... jetzt verstehe ich dich - glaube ich - richtig. ;D
dann geht das nur mit 2 Abfragen ...
siehe Beispiel
[Anhang gelöscht durch Administrator]
Ja, da scheinen wir uns dem Ziel zu nähern, das Ergebnis schaut schon mal gut aus...
nur wie frikkel ich das jetzt in ein einziges Statement?
Ich hangel mich gerade von Syntaxfehler zu Syntaxfehler...
Zitatnur wie frikkel ich das jetzt in ein einziges Statement?
Copy & Paste ist da sehr geeignet. Das ist gegeben (Abfrage2):
SELECT Tabelle1.Auftrag, Tabelle1.Zeit, Tabelle1.Ziel
FROM Tabelle1 INNER JOIN
Abfrage1
ON (Tabelle1.Zeit = Abfrage1.MaxvonZeit) AND (Tabelle1.Auftrag = Abfrage1.Auftrag)
WHERE (((Tabelle1.Ziel)="MNZ"))
Wenn man jetzt den Abfragenamen Abfrage1 als Alias betrachtet und die zugehörige SQL-Anweisung davor einfügt, sieht es etwa so aus:
SELECT Tabelle1.Auftrag, Tabelle1.Zeit, Tabelle1.Ziel
FROM Tabelle1 INNER JOIN
(SELECT Tabelle1.Auftrag, Max(Tabelle1.Zeit) AS MaxvonZeit
FROM Tabelle1
GROUP BY Tabelle1.Auftrag) AS Abfrage1
ON (Tabelle1.Zeit = Abfrage1.MaxvonZeit) AND (Tabelle1.Auftrag = Abfrage1.Auftrag)
WHERE (((Tabelle1.Ziel)="MNZ"))
Etwas aufgeräumter (erst filtern, dann joinen + Klammern reduziert + Tabellenaliase wo nötig) könnte es dann so aussehen:
SELECT
A.Auftrag,
A.Zeit,
A.Ziel
FROM
(
SELECT
Auftrag,
Zeit,
Ziel
FROM
Tabelle1
WHERE
Ziel = 'MNZ'
) AS A
INNER JOIN
(
SELECT
Auftrag,
Max(Zeit) AS MaxZeit
FROM
Tabelle1
GROUP BY
Auftrag
) AS B
ON
A.Auftrag = B.Auftrag
AND
A.Zeit = B.MaxZeit
MfGA
ebs
Ich produzier nach wie vor nur Syntax-Fehler...
strSQL = "SELECT A.trkAuftragsnummer, A.trkZeit, A.trkZiel " & _
"FROM ( " & _
"SELECT trkAuftragsnummer, trkZeit, trkZiel " & _
"FROM tblTrack " & _
"WHERE trkZiel = 'MNZ') AS A " & _
"INNER JOIN ( " & _
"SELECT trkAuftragsnummer, Max(trkZeit) AS MaxZeit " & _
"FROM tblTrack " & _
"GROUP BY trkAuftragsnummer) AS B " & _
"ON A.trkAuftragsnummer = B.trkAuftragsnummer AND A.trkZeit = B.MaxZeit) " & _
"WHERE A.trkZiel = 'MNZ';"
Ich habs, da war eine Klammer zu viel... (die letzte) Ich bedanke mich bei allen Helfern in diesem Thread recht herzlich!
Jetzt habe ich auch verstanden, warum gruppiert wird......
Zum Umwandeln einer SQL-Anweisung in etwas in VBA verwertbares könnte man eine Lösung hernehmen wie im Anhang dargestellt und so über etwas Automatisierung Routinearbeit reduzieren und die Fehlerquote, die gerade beim Überführen einer SQL-Anweisung in VBA-Code hoch ist, im Rahmen halten.
Die Inhalte der Datei sind aus einem größerem Projekt herausgelöst und in diesem Zusammenspiel nicht ausgetestet, mit Sicherheit aber im normalen Gebrauch verwendbar.
MfGA
ebs
[Anhang gelöscht durch Administrator]