SQL Grundlagen – Teil 3

Nachdem ich nun schon einen ersten Teil sowie auch schon einen zweiten Teil geschrieben habe, wird es mal Zeit einen weiteren Teil zu schreiben.
Nämlich ein paar Eigenheiten, die man aber immer wieder brauchen kann.

NULL Felder:
Beispielsweise die Prüfung von Checkbox (Boolean) Feldern isnull(a.wichtigerhaken,0)=0. Diese können unter Umständen gar nicht gefüllt sein, angehakt sein oder wieder abgehakt worden sein. Deshalb ist es sinnvoll den Zustand "nicht gefüllt" mit dem Zustand "nicht angehakt" gleichzusetzen. Das geschieht ganz einfach mit der Funktion isnull(). Im ersten Parameter wird das zu prüfende Feld eingetragen und im zweiten Parameter der Wert eingetragen, wenn es tatsächlich NULL also leer ist. isnull(a.wichtigerhaken,0) prüft also das Feld a.wichtigerhaken und setzt eine 0, wenn der Wert wirklich NULL ist. Und mit =0 wird geprüft ob das Feld dann 0 ist.
Würde man diese Prüfung mit isnull nicht machen, würde der Wert ein NULL zurückgeben und somit niemals auf =0 reagieren. Aber da NULL meistens mit 0 gleichzusetzen ist, muss man die NULL Felder mit 0 Werten deklarieren um die Prüfung korrekt durchführen zu können.

Datum beschränken:
Eine sehr einfache Lösung um die Antwortmenge auf einen bestimmten Zeitraum zu beschränken ist der Tag. Dazu macht man in der WHERE Klausel beispielsweise sowas hier um das Datum vor 3 Tagen und bis 14 Tage in der Zukunft zu haben. Dafür ist DATEADD() eine sehr gute Funktion:
and wa.termin >= DATEADD(DAY,-3,GETDATE())
and wa.TERMIN < DATEADD(DAY,14,GETDATE())

Das GETDATE() gibt einfach das aktuelle Datum zurück. Mit DATEADD(DAY,-3,GETDATE()) wird einer Tag ermittelt, der 3 Tage in ausgehend vom aktuellen Datum berechnet wird. DAY ist der Parameter, der besagt, dass der Tag geändert werden soll. Die -3 gibt an, dass 3 Tage zurückgerechnet werden soll und Getdate() gibt eben das aktuelle Datum vom System zurück. Dies ist also ein sehr einfacher Vergleichswert um zu sehen ob der wa.termin kleiner oder gleich das Datum 3 Tage in der Vergangenheit ist.
DATEADD(DAY,14,GETDATE()) macht das Gleiche analog wie oben. Nur 14 Tage in die Zukunft.

UNION:
Man kann auch mehrere Abfragen zusammenfassen. Dafür ist UNION das Mittel der Wahl. Beispielsweise, wenn man Daten für ein Chart benötigt, die sich auch immer auf den gleichen Zeitraum beziehen.
declare @limitAB int
set @limitAB = 100
SELECT wa.Termin,
'Belegt' as Art,
count(wa.nummer) as anzahl
From Warenausgang wa
Where wa.status = 9
Group by wa.Termin
UNION
SELECT wa.Termin,
'Frei' as Art,
case when count(wa.nummer) > @limitAB then 0 else @limitAB - count(wa.nummer) end as Anzahl
From Warenausgang wa
Where wa.status = 9
Group by wa.Termin
Order By wa.Termin, Art

Das obige Beispiel macht eine Abfrage und sucht erstmal die Anzahl der Warenausgänge pro Tag im angegebenem Zeitraum. Gleichzeitig wird auch eine Grenze von 100 definiert set @limitAB = 100. In der unteren SELECT Abfrage wird diese diese Grenze verwendet und die Anzahl der Warenausgänge abgezogen.

So habe ich am Ende eine Ergebnistabelle, welche mir 2 Werte liefert. Einmal die Anzahl der Warenausgänge als "Belegt" und noch die Restmenge als "Frei".
Würde ich nun in einem Programm ein Diagramm basteln, könnte ich so beide Werte in Abhängigkeit vom Termin verwenden.
UNION ist also ganz hilfreich um verschiedene Abfragen miteinander zu verbinden. Damit es funktioniert müssen die Abfragen aber Gemeinsamkeiten aufweisen. Über freie Felder wie in diesem Beispiel 'Frei' as Art kann man die Werte hinterher wieder unterscheiden.
Möchte man die Abfragen am Ende noch mit Order By sortieren ist es wichtig, diese Sortierung am Ende zu machen.

Und damit zurück ins Hauptstadtstudio zum Wetter!

Daily Music #713

Blind Guardian hatte ich nie so richtig auf dem Schirm. Der Bards Song den ich immer gehört habe, war irgendwie langweilig. Aber nun haben sie eine neue Single veröffentlicht und ich muss sagen. Das klingt richtig gut. Ich bin auf das Album gespannt.
BLIND GUARDIAN - Deliver Us From Evil