Hallo Wissende,
auf Arbeit betreue ich eine Datenbank, in der seit 2013 verschiedene Standorte von verschiedenen Werten täglich ihre Zählergebnisse eintragen. Jeder gezählte Wert ist ein Datensatz, die Tabelle "Eingänge" besteht aus den Feldern Datum, Standort, Kategorie und Wert. Das nur als kurze Erklärung, weil diese Werte aus dem SQL-Schnipsel unten hervorgehen. Standort und Kategorie schränken die Auswertung nur auf die gewünschten Daten ein, sind aber sonst nicht relevant. Ebenso findet ihr in dem SQL eine Funktion KW. Diese liefert die Kalenderwoche des übergebenen Datums als String im Format WW/JJJJ zurück. Auch das nur zum Verständnis.
Weil die Mengen immer saisonabhängig (wochenweise) steigen, möchte ich eine Abfrage machen, in der die Zeilen die Wochennummer repräsentieren und die Felder die Jahre, etwa so
Woche 2016 2017 2018
01 340 350 360
02 444 454 464
und so weiter. Die Zahlen sollen jeweils die Durchschnittswerte der Woche sein. Besonderheit ist noch, dass eine Woche erst dann genannt wird, wenn sie abgeschlossen ist, also aktuell wäre es
Woche 2016 2017 2018
...
39 540 550 560
40 644 654
denn die 40. KW läuft ja noch.
Das Thema mit Anzeige der vollen Wochen habe ich sogar hinbekommen (vielleicht nicht ganz elegant).
Aber als Access-Anfänger komme ich nicht damit klar, wie ich die SELECT-Anweisung so schreibe, dass das Gewünschte dabei rauskommt. Soweit bin ich:
SELECT
Wochenwerte.Wochennummer AS Wochennummer,
MAX(Wochenwerte.Jahr) AS Test
FROM
(
SELECT
KW([Eingänge.Datum]) AS Kalenderwoche,
RIGHT(Kalenderwoche,4)*15+LEFT(Kalenderwoche,2) AS EingangWochennummer,
YEAR(DATE())*15+LEFT(KW(DATE()),2) AS TagesdatumWochennummer,
IIF(EingangWochennummer<TagesdatumWochennummer,0,1) AS AbgeschlosseneWoche,
LEFT(KW([Eingänge.Datum]),2) AS Wochennummer,
RIGHT(KW([Eingänge.Datum]),4) AS Jahr,
ROUND(AVG([Eingänge.Wert]),0) AS Schnitt,
SUM([Eingänge.Wert]) AS Summe
FROM
Eingänge
WHERE
[Eingänge.Kategorie]=1 AND [Eingänge.Standort]<3
GROUP BY
KW([Eingänge.Datum])
) AS Wochenwerte
GROUP BY
Wochenwerte.Wochennummer,
Wochenwerte.AbgeschlosseneWoche
HAVING
SUM(Wochenwerte.AbgeschlosseneWoche) = 0
ORDER BY
Wochenwerte.Wochennummer
;
Meine Probleme nun:
1.) Wie schreibe ich die SELECT, um als Felder die Jahre "aktuell-2", "aktuell-1" und "aktuell" zu bekommen?
2.) Genau genommen soll jedes der genannte Jahre zwei Felder haben, und zwar zum einen den Durschnitt der entsprechenden Woche, und zum anderen die Summen, und zwar kumuliert vom Anfang des Jahres. Auch da weiß ich momentan nicht, wie man es hinbekommt, die Zeilen aufzuaddieren.
Vielen Dank im voraus, viele Grüße!
Hans-Jürgen
Hallo,
schau mal beim Abfrageentwurfsassistenten unter "Kreuztabelle" nach..
... und damit die Abfragen nicht einschlafen, würde ich Dir anraten, eine Dimensionstabelle für die Daten anzulegen. Das erspart dann in den Zielabfragen langsame Funktionen zur Ermittlung von KW und Jahr je Datensatz ausführen zu müssen.
Wenn Du im Beispiel die beiden Makros ausführst, werden die Tabellen mit Spieldaten gefüllt. Das Makro, welches die DateDim-Tabelle jeweils um Daten für ein Jahr eerweitert, musst Du natürlich mehrmals mit unterschiedlichen Jahresdaten ausführen. Du kannst auch im VBA-Direktfenster die Ausrufe vornehmen.
Anschließend kannst Du die beiden Kreuztabellenabfragen oder die Kombination der beiden Kreuztabellenabfragen verwenden.
Ich hoffe, dass das Prinzip verständlich ist.
PS: DateDim kannst Du natürlich auch schlanker - nur auf Deine Bedürfnisse ausgerichtet - anlegen; Erweitungen sind aber auch möglich.
Hallo zusammen,
wow, ihr seid klasse!
Die Antworten liegen zwar leicht über meinem Verständnisniveau, aber ich habe sie einem Kollegen gezeigt, der sich etwas besser auskennt (aber für mich auch keine Lösung fand)
Das größere Problem war am Ende nicht die Tabellendarstellung, sondern die Zusatzanforderung, das aufzusummieren.
Vielen Dank, Thema gelöst!
Hans-Jürgen