PDA

Vollständige Version anzeigen : SQL ist leicht (1) - Hilfstabellen


ebs17
17.03.2013, 16:55
Daten vervielfältigen mit Zahlen-Hilfstabelle

Öfters stellt sich die Aufgabe, dass Datensätze basierend auf gewissen Anfangsbedingungen erzeugt werden müssen. Wenn man sich in einer Datenbank bewegt, gibt es da gute Gründe, als Mittel dafür Hilfstabellen und SQL einzusetzen. Eine Hilfstabelle wäre in Vorbereitung einmalig zu erstellen und dann bei guter Planung oft und in vielfältigen Gestaltungen nutzbar.
In der Laufzeit wird dann eine Abfrage zur Datensatzerzeugung regelmäßig schneller sein als eine VBA-Schleife, und in vielen Fällen wird es ausreichend oder sogar besser sein, diese Datensätze in einer Abfrage vorzuhalten statt in einer Tabelle reale Datensätze zu erzeugen (und nachfolgend wieder entsorgen zu müssen).

In der beigefügten Anlage ist eine kleine Routine, in der einige DDL-Anweisungen zusammengefasst wurden, um eine Zahlentabelle mit einer laufenden Nummer von 0 bis gewähltem Endwert zu erzeugen. (Der interessierte Leser kann diese für sich selber analysieren.)
Der Standardaufruf <tt> CreateHelpTable CurrentDb </tt> erzeugt eine Tabelle "T999", mit der sich allerhand anfangen lässt. Dazu nachfolgend einige Beispiele:

Datensatzvervielfältigung durch pure Anwesenheit
Fall: Ein ausgewählter Datensatz zu einer Person soll vervielfältigt werden, um auf einfache Art Etiketten einer gewünschten Anzahl (z.B. 35) drucken zu können.
SELECT
Vorname,
Nachname,
Strasse,
PLZ,
Ort
FROM
tblPerson,
(
SELECT
I
FROM
T999
WHERE
I Between 1 AND 35
) AS X
WHERE
PersonID = 23
Alle einzelnen Tage eines Zeitraumes
Fall: In Datensätzen sind jeweils Beginn und Ende eines Zeitraumes als Angaben vorhanden. In einer Abfrage soll dieser Zeitraum in Tage aufgelöst werden:
SELECT
DateAdd('d', T.I, Z.Beginn) AS Tag,
Z.Anlass
FROM
tblZeitraum AS Z,
T999 AS T
WHERE
T.I Between 0 AND Z.Ende - Z.Beginn
Kalendertabelle füllen
Fall: Eine Kalendertabelle ist eine etwas spezialisiertere, aber ebenfalls häufig eingesetzte Hilfstabelle und bietet Vorteile in vielen Verwendungen. Wegen einer nachfolgenden Datenvermehrung ist es einerseits günstig, eine solche Tabelle übersichtlich klein zu halten. Andererseits muss der benötigte Wertebereich auch sicher vorgehalten werden. Da ist es hilfreich, wenn man für definierte Zeiträume die entsprechenden Tage ergänzen kann, im nachfolgenden Beispiel jeweils für ein Kalenderjahr:
PARAMETERS
ParamJahr INT
;
INSERT INTO
tblKalender(
KalenderTag,
WochenTag
)
SELECT
DateAdd('d', T.I, DateSerial([ParamJahr], 1, 1)) AS KTag,
Weekday(KTag, 2) AS WTag
FROM
T999 AS T
WHERE
T.I Between 0 AND DatePart('y', DateSerial([ParamJahr], 12, 31)) - 1
Das Zeigen dieser Beispiele soll nicht nur zum Kopieren und Nachahmen verleiten, sondern auch ein wenig eigene Kreativität befeuern, um zu zusätzlichen eigenen Varianten zu kommen und so Lösungen an sich sowie Performance generieren zu können. Viel Erfolg dabei.
Die folgende Abfrage, die ich abgeschrieben habe, zeigt eine erstaunliche Variante.
Monatsübersicht:
SELECT
Z.KW AS KW,
Max(IIf(Z.TW = 1, Z.TM)) AS MO,
Max(IIf(Z.TW = 2, Z.TM)) AS DI,
Max(IIf(Z.TW = 3, Z.TM)) AS MI,
Max(IIf(Z.TW = 4, Z.TM)) AS DO,
Max(IIf(Z.TW = 5, Z.TM)) AS FR,
Max(IIf(Z.TW = 6, Z.TM)) AS SA,
Max(IIf(Z.TW = 7, Z.TM)) AS SO
FROM
(
SELECT
DatePart("ww", Y.TJ, 2, 2) AS KW,
Day(Y.TJ) AS TM,
DatePart("w", Y.TJ, 2, 2) AS TW
FROM
(
SELECT
Date() - Day(Date()) + 1 + P.I AS TJ
FROM
T999 AS P
WHERE
P.I < 31
AND
Month(Date() - Day(Date()) + 1 + P.I) = Month(Date())
) AS Y) AS Z
GROUP BY
Z.KW

PP17
21.06.2013, 23:45
Hallo Eberhard,
vielen Dank für die Beispiele. Habe nur Schwierigkeiten dieses umzusetzen. Wie soll ich denn die Abfrage gestalten? Ich nehme die Tabelle mit den Abwesenheiten und dann ????????
Hättest Du evtl. eine Beispiel-Datei?
Peter

ebs17
22.06.2013, 08:12
"die Abfrage" ist was für eine?

Hinweis: Hier bist Du im Code-Archiv = Platz für allgemeine Beispiele und Lösungen zum Nachschlagen und Informieren.

Konkrete Fälle bespricht man besser in einem eigenen Thema im allgemeinen Access-Forum, und dort dann auch mit einer hinreichenden Darstellung der Situation und nicht nur mit einer Andeutung wie oben.