MSSQL Daten in Zeitraum eingrenzen und addieren
Hallo Community,
ich habe ein kleines Projekt angenommen und versuche mich derzeit ein bisschen damit zurecht zu finden. Leider stoße ich jetzt auf ein Problem, das ich nicht gelöst bekomme und hoffe daher auf eure Hilfe.
Da ich in Programmierung sowie SQL nicht so fit bin, versuche ich code-snippets auf mein geringes vorhandes Know-How anzuwenden. Zu meinem Problem.
Ich habe zwei Tabellen. Eine Tabelle besteht aus Daten die sekündlich/minütlich einen Wert schreiben. Dann habe ich eine Tabelle in der ich händisch die Zeiten eintrage, wann ein Artikel produziert wurde.
Nun möchte ich gerne eine Abfrage bauen, die mir jeweils den Zeitraum eingrentzt. Z.b. Zeile 2 zwischen 20:01 und 22:00 Uhr . Dann soll er alle Daten zwischen diesem Zeitraum aus Tabelle Daten lesen und zusammenaddieren. Ich hoffe das war einigermaßen verständlich.
Ich versuche mal eine beispielausgabe zu schreiben.
Zwischen 19 und 20 Uhr wurden 22 Artikel mit der Artikelnummer 4444 Produziert.
Zwischen 20:01 und 22 Uhr wurden 9 Artikel mit der Artikelnummer 3333 Produziert.
Zwischen 22 und 23:59 Uhr wurden 6 Artikel mit der Artikelnummer 4444 Produziert.
Tabelle Zeiten (Anfangszeit, Endzeit, Artikelnummer)
Spalte 1 | Spalte 2 | Spalte 3
19:00 20:00 4444
20:01 22:00 3333
22:01 23:59 4444
Tabelle Daten (Zeit, Wert)
17:01 44
17:02 86
17:03 92
19:03 10
19:59 12
20:01 9
22:03 5
23:33 1
...
Die Select Anweisung klappt bei mir, allerdings der Rest leider nicht. Ich bin mir auch sicher, ob ein Cursor die richtige Wahl ist?
DECLARE xxxx CURSOR LOCAL STATIC
FOR
SELECT [Spalte1]
FROM [DBNAME].[dbo].[DBTABLE] WHERE [Timestamp] Between '2015-09-22 16:57:11.150' AND '2015-09-22 17:00:06.151'
Open xxxx
DECLARE @uebergabe float
Fetch next from xxxx into @uebergabe
while @@FETCH_STATUS = 0
DECLARE @test float = 0
Begin
SET @test =+ @uebergabe
fetch next from xxxx into @uebergabe
end
close xxxx
select @test
Vielen Dank für eure Hilfe
nutzloser-user
UPDATE:
HI,
ich habe den Code mal ausprobiert, aber leider macht er noch nicht genau das was er sollte. Ich versuche jetzt einen anderen Weg. Ich möchte zunächst alle Werte eines bestimmten Zeitfensters eines Produktes ausgeben. Ich habe dazu mal ein "SQL" geschrieben. Leider habe ich dort den Fehler, das wenn ich versuche die Variable "TEST" mit der Unterabfrage zu füllen, das ich einen NULL Wert erhalte. Wenn ich das Datum in der Unterabfrage direkt eingebe, erhalte ich Werte. Wo liegt der Fehler?
ich habe ein kleines Projekt angenommen und versuche mich derzeit ein bisschen damit zurecht zu finden. Leider stoße ich jetzt auf ein Problem, das ich nicht gelöst bekomme und hoffe daher auf eure Hilfe.
Da ich in Programmierung sowie SQL nicht so fit bin, versuche ich code-snippets auf mein geringes vorhandes Know-How anzuwenden. Zu meinem Problem.
Ich habe zwei Tabellen. Eine Tabelle besteht aus Daten die sekündlich/minütlich einen Wert schreiben. Dann habe ich eine Tabelle in der ich händisch die Zeiten eintrage, wann ein Artikel produziert wurde.
Nun möchte ich gerne eine Abfrage bauen, die mir jeweils den Zeitraum eingrentzt. Z.b. Zeile 2 zwischen 20:01 und 22:00 Uhr . Dann soll er alle Daten zwischen diesem Zeitraum aus Tabelle Daten lesen und zusammenaddieren. Ich hoffe das war einigermaßen verständlich.
Ich versuche mal eine beispielausgabe zu schreiben.
Zwischen 19 und 20 Uhr wurden 22 Artikel mit der Artikelnummer 4444 Produziert.
Zwischen 20:01 und 22 Uhr wurden 9 Artikel mit der Artikelnummer 3333 Produziert.
Zwischen 22 und 23:59 Uhr wurden 6 Artikel mit der Artikelnummer 4444 Produziert.
Tabelle Zeiten (Anfangszeit, Endzeit, Artikelnummer)
Spalte 1 | Spalte 2 | Spalte 3
19:00 20:00 4444
20:01 22:00 3333
22:01 23:59 4444
Tabelle Daten (Zeit, Wert)
17:01 44
17:02 86
17:03 92
19:03 10
19:59 12
20:01 9
22:03 5
23:33 1
...
Die Select Anweisung klappt bei mir, allerdings der Rest leider nicht. Ich bin mir auch sicher, ob ein Cursor die richtige Wahl ist?
DECLARE xxxx CURSOR LOCAL STATIC
FOR
SELECT [Spalte1]
FROM [DBNAME].[dbo].[DBTABLE] WHERE [Timestamp] Between '2015-09-22 16:57:11.150' AND '2015-09-22 17:00:06.151'
Open xxxx
DECLARE @uebergabe float
Fetch next from xxxx into @uebergabe
while @@FETCH_STATUS = 0
DECLARE @test float = 0
Begin
SET @test =+ @uebergabe
fetch next from xxxx into @uebergabe
end
close xxxx
select @test
Vielen Dank für eure Hilfe
nutzloser-user
UPDATE:
HI,
ich habe den Code mal ausprobiert, aber leider macht er noch nicht genau das was er sollte. Ich versuche jetzt einen anderen Weg. Ich möchte zunächst alle Werte eines bestimmten Zeitfensters eines Produktes ausgeben. Ich habe dazu mal ein "SQL" geschrieben. Leider habe ich dort den Fehler, das wenn ich versuche die Variable "TEST" mit der Unterabfrage zu füllen, das ich einen NULL Wert erhalte. Wenn ich das Datum in der Unterabfrage direkt eingebe, erhalte ich Werte. Wo liegt der Fehler?
Bitte markiere auch die Kommentare, die zur Lösung des Beitrags beigetragen haben
Content-ID: 284208
Url: https://administrator.de/contentid/284208
Ausgedruckt am: 19.11.2024 um 17:11 Uhr
3 Kommentare
Neuester Kommentar
Ich würde auf Cursor verzichten wo es geht. In diesem Fall würde ich mit CTE eine Rastertabelle erzeugen und darauf deine Daten joinen und gruppieren.
PS: Das Raster brauchst du eigentlich auch nur wenn du anzahl 0 in einem Interval abbilden willst. Ansonsten reicht auch ein völlig banales GROUP BY.
WITH raster(zeit_von,zeit_bis) AS (
SELECT cast('00:00' AS TIME),
cast('00:14:59.9999999' AS TIME)
UNION ALL
SELECT dateadd(mi,15,zeit_von),
dateadd(mi,15,zeit_bis)
FROM raster
WHERE zeit_von <= cast('23:30' AS TIME)
)
SELECT r.zeit_von,
r.zeit_bis,
t.Wert,
sum(t.Wert) AS anzahl
FROM raster r
LEFT JOIN Daten t
ON cast(t.Zeit AS TIME) BETWEEN r.zeit_von AND r.zeit_bis
GROUP BY r.zeit_von,r.zeit_bis,t.Wert
OPTION (MAXRECURSION 100)
PS: Das Raster brauchst du eigentlich auch nur wenn du anzahl 0 in einem Interval abbilden willst. Ansonsten reicht auch ein völlig banales GROUP BY.
Hier mal das ganz banale GROUP BY. Das einzig knifflige ist es, das komplette Datum mit Zeit auf einen Stundeninterval oder ähnliches runter zu brechen. (Und dann am besten auch noch so, das es sowohl mit englischem als auch mit deutschem Datumsformat läuft.)
SELECT t.Anfangszeit,
t.Anfangszeit + cast(cast('00:59:59.9999999' AS TIME) AS DATETIME) AS Endzeit,
t.Artikelnummer,
t.Anzahl
FROM (
SELECT cast(cast(Zeit AS DATE) AS DATETIME) + cast(left(cast(Zeit AS TIME),2)+':00:00.000' AS DATETIME) AS Anfangszeit,
Artikelnummer,
sum(Wert) AS Anzahl
FROM Daten
GROUP BY cast(cast(Zeit AS DATE) AS DATETIME) + cast(left(cast(Zeit AS TIME),2)+':00:00.000' AS DATETIME),Artikelnummer
) t