7.4k Aufrufe
Gefragt in Datenbanken von rw988 Einsteiger_in (23 Punkte)
Hallo,
ich bin neu hier.
Ich habe folgendes Problem:

In einer Datenbank stehen Datensätze in 5 Minuten-Intervallen.
Also, je 5 Minuten-Intervall 1 Datensatz, insgesamt umfasst die Datenbank 1ganzes Jahr (365*24*12=105120 Datensätze).
Jetzt möchte ich Summen je Stunde bilden. Im Prinzip nicht schwer.
Aber: manche 5-Minuten-Intervalle sind leer, d.h. der datensatz ist vorhanden (in Spalte 1 steht der Datumswert), aber das Feld, das aufsummiert werden soll ist leer wg. Messfehler.
Die Bedingung bei der Abfrage ist nun, dass die Stundensumme ebenfalls leer sein soll, sobald ein 5-Minuten-Intervall fehlt. Es soll in der Ergebnistabelle aber für diese fehlende Stunde ein leerer Datensatz angezeigt werden, sodass die Tabelle 365*24=8760 Datensätze haben muss.

Wie bekomme ich das hin? Ich steh da aufm Schlauch.

Außerdem will Access partout nicht die Datensätze nach dem Datum korrekt sortieren. Auf den 1.Januar folgt der 1.Februar und nicht der 2.Januar, wie man es gewohnt ist.

8 Antworten

0 Punkte
Beantwortet von marie Experte (2k Punkte)
Außerdem will Access partout nicht die Datensätze nach dem Datum korrekt sortieren. Auf den 1.Januar folgt der 1.Februar und nicht der 2.Januar, wie man es gewohnt ist.


hallo, mit "Stundensumme" und "5-Minuten-Intervall" kann man nicht sehr viel anfangen. Schreib mal bitte welche formatierung Du benutzt und wie deine Felder heißen? Am besten postest Du hier mal den SQL-Code deiner falschen Abfrage und schreibst dann, was falsch ist oder fehlt. Wenn bei Dir auf den 1. Januar der 1. Februar folgt beim Datum, dann vermute ich mal, dass Du kein Datumsformat benutzt hast. Um Dir helfen zu können ist es aber wichtig, dass man deine Formate kennt und auch wie deine erste Spalte heißt.

Du drückst Dich auch ein bissel seltsam aus

Jetzt möchte ich Summen je Stunde bilden.
Was soll das heißen?

(365Tage*24Stunden*12Fünfminutenintervalle=105120 Datensätze). 365*24=8760 Datensätze soll Deine Abfrage haben, also pro Stunde einen Datensatz. Wenn ich Dich richtig verstehe hast Du das schon gelöst? Dann schick den SQL-Code der Abfrage rüber und schreib dazu was wo drinsteht, dann mach ich Dir die Bedingung dazu, dass das betreffende feld leer ist, sobald ein 5-Minuten-Intervall-Datensatzfeld leer ist. Und verwechsle bitte nicht ständig Tabelle mit Abfrage, sag genauer was Du willst. Willst Du eine neue Tabelle erstellen oder nur eine Abfrage?

Gruß marie
0 Punkte
Beantwortet von rw988 Einsteiger_in (23 Punkte)
Hallo,

also Stundensumme bedeutet einfach, dass die Summe aller 12 5-Minuten-Intervalle in einer Stunde gebildet werden soll.
Dazu ist aber Voraussetzung, dass 12 Intervalle vorhanden sind. Wenn in einem Intervall kein Wert gemessen wurde, soll keine Summe, sondern eine Leerzeile ausgegeben werden.

Das Feld Datum ist als Datum/Uhrzeit definiert. Normalerweise funktioniert die Sortierung einwandfrei, nur eben nicht bei diesen Abfragen.

Der SQL-Code der entsprechenden Abfrage sieht so aus:

SELECT DISTINCTROW Weekday([Datum],2) AS WoTag, Format$([Tabelle].[Datum],'dd.mm.yyyy hh:00') AS [Datum nach Stunden], Sum(Tabelle.[Wert]) AS [Summe von Wert]
FROM Tabelle
GROUP BY Weekday([Datum],2), Format$([Tabelle].[Datum],'dd.mm.yyyy hh:00')
ORDER BY Format$([Tabelle].[Datum],'dd.mm.yyyy hh:00');

(Tabelle und Wert sind hier Platzhalter für die richtigen Namen, die ich mir aus Gründen der Vereinfachung spare)
0 Punkte
Beantwortet von rw988 Einsteiger_in (23 Punkte)
Hallo Marie,

noch eine Ergänzung zur vorherigen Antwort:

Die Anzahl der Datensätze der Ergebnistabelle soll die Anzahl der Stunden pro Jahr sein, also 8760 in einem normalen Jahr. Meine Abfrage macht das auch, wobei es nicht gelingt, eine Leerzeile für unvollständige Stunden zu erzeugen. D.h. es sollte eine Leerzeile erzeugt werden, wenn von den 12 5-Minuten-Intervallen einer Stunde mindestens bei einem in der Spalte 'Wert' ein Null-Wert steht. Das klappt im Moment noch nicht.

Ich habe die Abfrage weitgehend mit dem Abfrage-Assistenten in Access aufgebaut.
Ich verwende übrigens Access 2000
0 Punkte
Beantwortet von rahi Experte (1.5k Punkte)
Hallo re988,

Was steht im Feld WERT, wenn der Wert fehlt, eine leere Zeichenkette oder NULL (der nix-Wert
;-) ?

Gruß Ralf
0 Punkte
Beantwortet von rw988 Einsteiger_in (23 Punkte)
Hallo Ralf,

Was steht im Feld WERT, wenn der Wert fehlt, eine leere Zeichenkette oder NULL (der nix-Wert
;-) ?


in dem Feld Wert steht der NULL-Wert, wenn es leer ist. Das ist allerdings steuerbar, da ich vorher über ein VisualBasic-Programm aus verschiedenen Fehlerquellen diese Leerwerte ermittle und auswerte und dann in dem jeweiligen Datensatz im Feld Wert ein NULL erzeuge, wenn der Wert fehlerhaft ist.
Insofern könnte ich dort auch was anderes reinschreiben, wenn es besser verarbeitbar wäre. Ich wollte jedoch in keinem Fall eine Null (0) erzeugen, da 0 als ordentlicher Wert durchaus möglich ist. Es musste eine Unterscheidung her zwischen einer 0 und einem Messfehler.

Grüße
0 Punkte
Beantwortet von lorf55 Mitglied (699 Punkte)
Hallo rw988,
ich glaube, ich habe eine Lösung für dein Problem:

SELECT DISTINCTROW
Weekday(Datum,2) AS WoTag,
Format$(Datum,'dd.mm.yyyy hhU\hr') AS [Datum nach Stunden],
IIf(Count(Wert)=12,Sum(Wert),NULL) AS [Summe]
FROM Tab
GROUP BY Weekday(Datum,2), Format$(Datum,'dd.mm.yyyy hhU\hr')
ORDER BY Format$(Datum,'dd.mm.yyyy hhU\hr');


Die Anweisung zählt zusätzlich zu deiner Anweisung die Anzahl der Werte pro Gruppe. Ist die 12, wird die Summe gebildet und sonst NULL zurückgegeben, so dass die entsprechende Zeile leer ist.

Gruß
lorf
0 Punkte
Beantwortet von rw988 Einsteiger_in (23 Punkte)
Hallo lorf,

Super, das hat geklappt.
Vielen Dank.
Mir war gar nicht klar, dass man in der Abfrage auch noch weitere Bedingungen mit IIF einbauen kann. Toll!
Das einzige Problem ist jetzt noch, dass die Sortierung des Datums nicht richtig klappt, da das Datum durch Format$ in einen String umgewandelt wird. Daher folgt auf den 01.01. der 01.02.
Aber das Hauptproblem ist schon mal gelöst.
Danke nochmal

Grüße
rw988
0 Punkte
Beantwortet von rw988 Einsteiger_in (23 Punkte)
Noch ein Nachtrag:

das mit der richtigen Sortierreihenfolge klappt jetzt, indem ich den
Datumstring mit CVDate() wieder ins Datumformat zurückwandele (keine Ahnung, warum das überhaupt notwendig ist....)

SELECT DISTINCTROW
Weekday(Datum,2) AS WoTag,
CVDate(Format$(Datum,'dd.mm.yyyy hh:00')) AS [Datum nach Stunden],
IIf(Count(Wert)=12,Sum(Wert),NULL) AS [Summe]
FROM Tab
GROUP BY Weekday(Datum,2), CVDate(Format$(Datum,'dd.mm.yyyy hh:00'))
ORDER BY CVDate(Format$(Datum,'dd.mm.yyyy hh:00'));
...