Neuigkeiten:

Ist euer Problem gelöst, dann bitte den Knopf "Thema gelöst" drücken!

Mobiles Hauptmenü

Werte einer Tabelle abhängig vom Datum voneinander abziehen

Begonnen von ironpete, Januar 23, 2013, 09:58:06

⏪ vorheriges - nächstes ⏩

ironpete

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.

database

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

ironpete

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

MzKlMu

Hallo,
was willst Du für einen Ersatzwert (Datum) verwenden, wenn das Feld leer ist?
Gruß Klaus

ironpete

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

MzKlMu

Gruß Klaus

ironpete

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. :-\

database

#7
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]

ironpete

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!