Datumsabfrage

jBourne242

Neuer Benutzer
Beiträge
2
Hallo Miteinander,

ich habe eine Datenbank mit Aufträgen. Zu jedem Auftrag gibt es ein Wareneingangsdatum und ein Lieferscheindatum. Die Zeitspanne dazwischen ist somit der Verbleib im Unternehmen. Außerdem enthält jeder Auftrag eine Gewichtsangabe.

Nun möchte ich in einem bestimmten Datumsbereich den Warenbestand (Summe der Gewichte) für jeden Tag innerhalb dieses Datumsbereichs anzeigen. Mein Problem ist, dass ein Datensatz ja bei mehreren Tagen vorhanden sein muss.

Beispiel:
Wareneingang: 01.01.2014
Lieferschein: 07.01.2014

Wenn ich nun eine Abfrage für Januar 2014 mache, muss das Gewicht dieses Auftrags für jeden Tag zwischen dem 01.01. und 07.01.2014 in das Summenergebnis mit einfließen.

Kann mir jemand hier einen Denkanstoß geben, wie ich diese Abfrage realisiere. Ergebnis sollte wie folgt aussehen:

01.01.2014: 720 kg
02.01.2014: 834 kg
03.01.2014: 420 kg
...

Gruß
jBourne
 
Werbung:
Kann mir jemand hier einen Denkanstoß geben, wie ich diese Abfrage realisiere.

Hier mal ein Denkansatz:
Code:
WITH RECURSIVE Kalender (Tag)
AS (
SELECT '2014-01-01'::date AS Tag
UNION ALL
SELECT Tag + 1
FROM Kalender
WHERE Tag < '2014-01-07'::date
)
SELECT Tag, SUM(Gewicht) FROM Kalender
INNER JOIN jbourne
ON eingang <= Tag
AND schein >= Tag
GROUP BY Tag
ORDER BY Tag

Getestet in PostgreSQL. Sollte sich aber für MS-SQL umformen lassen.

Gruß
Hony
 
Das kann man auch wunderbar mit BETWEEN lösen. Das schwierige ist eigentlich erstmal eine Liste aller Tage zu erzeugen wie Hony% das auch schon getan hat. Hier mal die MSSQL Version:
Code:
WITH    Kalender AS (
SELECT    cast('20130101' AS DATETIME) AS Tag
UNION ALL
SELECT    dateadd(dd,1,Tag)
FROM    Kalender
WHERE    dateadd(dd,1,Tag) <= '20130630'
)
SELECT    convert(VARCHAR(10),k.Tag,104) AS Datum
FROM    Kalender k
ORDER BY k.Tag
OPTION    (MAXRECURSION 0);
http://social.technet.microsoft.com...aff35cc9c/datumliste-erzeugen?forum=sqlserver

Und dann einfach das Gewicht summieren:
Code:
WITH    Kalender AS (
SELECT    cast('20130101' AS DATETIME) AS Tag
UNION ALL
SELECT    dateadd(dd,1,Tag)
FROM    Kalender
WHERE    dateadd(dd,1,Tag) <= '20130630'
)
SELECT    convert(VARCHAR(10),k.Tag,104) AS Datum,
        sum(t.gewicht) AS Gewicht
FROM    Kalender k
LEFT JOIN tabelle t
ON        k.Tag BETWEEN t.eingangsdatum AND t.lieferscheindatum
GROUP BY k.Tag
ORDER BY k.Tag
OPTION    (MAXRECURSION 0);
 
Werbung:
Zurück
Oben