Ich habe ein LOG Tabelle, in die täglich verschiedene Werte abgespeichert werden. Sagen wir
itemNo, qty, date
Nun möchte ich die Werte abhängig vom Datum per Abfrage voneinander abziehen, d.h. z.B. qty von date() - qty von date()-5
Ich kriege das sql statement nicht zusammen und per Abfrage-Assisstent auch nicht. :-\
Stümperhaft habe ich bisher folgendes gemacht:
Abfrage1: Select * FROM LOG where date()
Abfrage2: Select * FROM LOG where date()-5
Abfrage 3: Select Abfrage1.itemNo, Abfrage1.qty-Abfrage2.qty AS delta FROM Abfrage1 LEFT JOIN Abfrage2 ON Abfrage1.itemNo = Abfrage2.itemNo;
Wie müsste ich es schreiben, damit das in ein sql statement passt?
Letztendlich möchte ich die LOG Tabelle per Kalenderfunktion filtern, indem ich aus einem formular einen Wert DatumVon und DatumBis übergebe. Formular und Kalenderfunktion stehen schon. Es fehlt nur noch die Abfrage, die mit den Datumswerten gefüttert werden soll.
Hallo,
versuch mal so:
Abfrage1: Select * FROM LOG where date = date()
Abfrage2: Select * FROM LOG where date = date()-5
SELECT Sum([qry1].[qty]-[qry2].[qty]) AS DELTA, qry1.itemNo
FROM qry1 INNER JOIN qry2 ON qry1.itemNo = qry2.itemNo
GROUP BY qry1.itemNo;
HTH
super, danke. Habe es fast 1:1 übernommen. so hat es funktioniert
SELECT q1.qty - q2.qty AS delta. q1.itemNO
FROM LOG AS q1 LEFT JOIN LOG AS q2 ON q1.itemno = q2.itemno
WHERE q1.datum=#date1# and q2.datum=#date2#
Jetzt habe ich nur noch eine Frage: Manchmal gibt es zwar datum1 aber nicht datum2 in der Tabelle, weil eine itemNo an dem jeweilgen Tag nicht vorhanden war. D.h. ich will datum1-datum2 rechnen, geht aber nicht.
habe das hier versucht, geht aber nicht. Liefert nichts zurück. Gibt es etwas geeigneteres als mit IsNull zu prüfen, ob überhaupt ein Eintrag vorhanden ist?
SELECT q2.itemNo, q2.qty-(IIf(IsNull(q1.qty),0,q1.qty)) AS delta
Hallo,
was willst Du für einen Ersatzwert (Datum) verwenden, wenn das Feld leer ist?
sagen wir 01.01.1900
Ich dachte wenn ich einen LEFT JOIN mache, dann müssten mir alle Werte angezeigt werden. Im Moment ist es als ob es ein inner join sei.
q1 hat am 22.01.2013 200 Einträge
q2 hat am 21.01.2013 170 Einträge
Bei
SELECT q1.qty - (wenn(isnull(q2.qty);0;q2.qty)) AS delta, q1.itemNO
FROM LOG AS q1 LEFT JOIN LOG AS q2 ON q1.itemno = q2.itemno
WHERE q1.datum=#22.01.2013# and q2.datum=#21.01.2013#
müsste ich doch 200 Einträge bekommen. Leider sind es genau nur 170
Hallo,
verwende mal Right statt Left.
hallo,
RIGHT macht keinen Sinn, weil die "rechte" tabelle nur 170 Einträge hat. Die linke hat 200 und ich möchte alle Einträge der linken sehen. :-\
Hallo,
was passiert, wenn du gemäß meinem Vorschlag die Log-Tabelle VORHER durch 2 Abfragen aufteilst und dich dann auf die Felder der Abfragen beziehst?
sonst:
SELECT q1.qty - NZ(q2.qty;0) AS delta
ZitatRIGHT macht keinen Sinn, weil die "rechte" tabelle nur 170 Einträge hat. ...
Das siehst du ja ganz genau in den Eigenschaften der Verknüpfung ... ALLE DS von Tabelle1 und nur die DS von TAbelle 2, bei denen die ... / ALLE DS von Tabelle 2 ....
Somit macht RIGHT wohl einen Sinn, da MzKlMu ja nicht wissen kann, welche Tabelle bei dir rechts und welche links steht.
Übrigens ... bei mir funktioniert es mit LEFT JOIN
[Anhang gelöscht durch Administrator]
wenn ich es in 2 Abfragen teile und dann die differenz bilde, klappt es wunderbar.
Der JOIN scheint ne Macke zu haben.
Ich belasse es einfach bei den drei Abfragen. Es funktioniert. Danke für die Mühe und Hilfe!