SQL – DB2 einen Datensatzzähler einbauen

Die DB2-Funktion ROW_NUMBER() in Kombination mit OVER()  liefert einen Datensatzzähler in der Ergebnismenge als eigene Spalte.Wird ein eigener Gruppenwechsel – also eine Nummerierung über einen bestimmten Teil der Ergebnismenge – gewünscht, so ist in der Funktion OVER() die Partitionierung (also das oder die Attribute der Gruppe) und eine Sortierung via ORDER BY anzugeben.

select 
  ROW_NUMBER () OVER ()
from 
  dbpost01.vwpo0021koko
where 
  fs_dvsys#zuliefer = 400 
  and '29.08.2014' between koko_glt_v_dat and koko_glt_b_dat 
and fs_gp = 2 

Hier ein Beispiel mit einem Gruppenwechsel:

select 
  ROW_NUMBER () OVER (PARTITION BY fs_gesggrbl order by fs_gesggrbl asc) as zeile 
  , fs_gesggrbl
from 
  dbpost01.vwpo0021koko
where 
  fs_dvsys#zuliefer = 400 
  and '29.08.2014' between koko_glt_v_dat and koko_glt_b_dat 
  and fs_gp = 16

QMF – Prozeduren (QMF for Workstation V9.1)

Mit dem  Tool QMF for Workstation V9 ist es sehr einfach Prozeduren zu erstellen. Prozeduren dienen dazu, eine Reihe von SQL-Queries hintereinander abzuarbeiten, ohne dies mit jeder Query einzeln zu tun. Das im Allgemeinen kann schon eine Arbeitserleichterung sein, das eigentlich trickreiche dabei ist, dass unter Verwendung von Substitutionsvariablen und globalen Variablen bereits bestehende Queries unverändert in eine Prozedur gepackt werden können und sozusagen alle auf Knopfdruck abgearbeitet werden können. Diese Beschreibung beruht auf der Version V9.1 Fix Pack 17.

Überblick

Wie geht man am Besten vor?
1. Erstellen einer Prozedur und setzen von globalen Variablen
2. Erstellen der einzelnen SQL Queries unter Verwendung von Substitutionsvariablen
3. Einbinden/Aufruf der SQL-Queries in die aufrufende Prozedur

Detail

1. Erstellen einer Prozedur

Das Erstellen einer neuen Prozedur erfolgt über den Menüpunkt „File -> New -> Other“. Im darauf folgenden Wizard ist zuerst der Eintrag „Procedure“ auszuwählen und anschließend auf den Button „Next“ zu klicken.

prozedur_001

Anschließend muss der Prozedur ein Name gegeben werden, sowie eine Datenquelle ausgewählt werden. Durch die Bestätigung des Buttons „Finish“ wird eine leere Prozedur erstellt:

prozedur_002

In der leeren Prozedur können nun über den SET-Befehl globale Variablen gesetzt werden. Kommentare werden, genauso wie in SQL-Queries, mit zwei Minuszeichen eingeleitet. Im unten angefügten Beispiel wird zuerst die Systemvariable (Systemvariablen sind fest vorgegebene Variablennamen die mit DSQ beginnen) DSQQW_PROC_WNDWS auf den Wert 1 gesetzt. Das führt dazu, dass alle Ergebnisse der aufgerufenen Queries offen (angezeigt) bleiben. Im zweiten SET-Befehl wird die Substitutionsvariable FBDATUM global verfügbar gemacht. Das heißt, beim Aufruf der Prozedur erscheint einmalig ein Eingabedialog der zur Eingabe des Fachbestandsdatums führt und gleichzeitig wird die Variable zu einer globalen Variable gemacht. Globale Variablen sind während der gesamten Laufzeit der Prozedur verfügbar. In sämtlichen Queries kann auf diese einmalig gefüllte globale Variable zugegriffen werden.


-- DSQQW_PROC_WNDWS=1 (alle Fenster bleiben offen)
-- DSQQW_PROC_WNDWS=0 (nur das letzte Fenster bleibt offen)
SET GLOBAL (DSQQW_PROC_WNDWS=1
-- Durch das u.a. SET Statement wird die Substitutionsvariable
-- zur globalen Variable.
SET GLOBAL (FBDATUM=&FBDATUM)

 

2. Erstellen von Queries unter Verwendung von Substitutionsvariablen

In den in der Prozedur aufgerufenen Queries kann mit der in der Prozedur gesetzten globalen Variable (&FBDATUM) gearbeitet werden. Zum Beispiel so:

SELECT
&FBDATUM AS Stichtag
,'TIKOND' AS Tabelle
,FS_KOKO#DVSYS#ZUL AS DVSYS
,FS_KOKO#UTEIL AS Uteil
,COUNT(*) AS Anzahl
FROM
DBPOST06.VWPO0453TIKOND
WHERE
TIKOND_GLT_V_DAT <= &FBDATUM AND TIKOND_GLT_B_DAT >= &FBDATUM
AND FS_KOKO#DVSYS#ZUL = 400
GROUP BY
FS_KOKO#DVSYS#ZUL
,FS_KOKO#UTEIL

3. Aufruf der Queries in der Prozedur

In der Prozedur muss nun nur noch der Aufruf der SQL-Query erfolgen. Dies können selbstverständlich beliebig viele Queries sein.

run query y0e6844.COUNT_TIKOND

4. Speicherort der Queries und Prozeduren

Damit die Queries wie im oben angeführten Beispiel aufgerufen werden können, müssen diese im QMF-Katalog abgespeichert werden. Sinnvollerweise sollen diese Queries für alle Teammitglieder freigegeben (shared) werden.
Speichern: Menüpunkt File->Save At->QMF Catalog…

prozedur_003

Alternativ können Prozeduren und Queries auch auf dem lokalen oder einem Netz-Laufwerk abgespeichert werden.

Besonderer Hinweis

Der Gültigkeitsbereich einer selbst definierten globalen Variablen ist auf die QMF-Session beschränkt. Beendet man die QMF-Session, sind auch alle selbst definierten Variablen wieder gelöscht. Man kann/muss jedoch mit RESET GLOBAL selbst die Variablen bzw. deren Inhalte löschen.

Wenn man sehen will, welche globalen Variablen mit welchem Wert gesetzt sind, so kann man unter „View -> Preferences -> Global Variables“ dies überprüfen:

prozedur_004

Beispiel: Eine lauffähige Prozedur – Quellcode

 

SET GLOBAL (DSQQW_PROC_WNDWS=1)
SET GLOBAL (FBDATUM=&FBDATUM)

run query y0e6844.COUNT_KOKO
run query y0e6844.COUNT_TBETR
run query y0e6844.COUNT_ZSUR
run query y0e6844.COUNT_ZIKOND
run query y0e6844.COUNT_TIKOND

RESET GLOBAL ALL

SQL – DB2 den größten Wert aus mehreren Spalten ermitteln

Die DB2-Funktion MAX berechnet den Maximalwert in einer Spalte – diese Funktionalität wird häufig benötigt und oft verwendet. Weniger bekannt sind die Scalar-Funktionen GREATEST oder LEAST. Mit GREATEST lassen sich auf sehr einfache Weise die Maximalwerte aus mehreren Spalten ermitteln. Mit LEAST lassen sich aus mehreren Spalten die Minimalwerte ermitteln. Eine Beschränkung bezüglich der Spaltenanzahl gibt es nicht, jedoch müssen die Spalten vom gleichen Datentyp sein, damit das Ergebnis Sinn macht.

 


 -- den Maximalwert aus zwei Spalten ermitteln
 SELECT
   KOKO_SAB_U_WHG_BET AS SAB_U
   , KOKO_SAB_K_WHG_BET AS SAB_K
   , GREATEST ( KOKO_SAB_U_WHG_BET , KOKO_SAB_K_WHG_BET ) AS GREATEST
 FROM
   DBPOST01.VWPO0021KOKO
 WHERE
   &FBDAT BETWEEN KOKO_GLT_V_DAT AND KOKO_GLT_B_DAT
   AND FS_DVSYS#ZULIEFER = 41
   AND KOKO_SAB_U_WHG_BET IS NOT NULL
   AND KOKO_SAB_K_WHG_BET IS NOT NULL
 
 Ergebnis:
SAB_U SAB_K GREATEST
-888888 0 0
-390000000 -75000000 -75000000
-687581,34 -618822,94 -618822,94

Zu beachten ist, dass Spalten die NULL Werte enthalten immer dazu führen, dass das Ergebnis der GREATEST oder LEAST Funktionen NULL ist. Möchte man das umgehen, so kann man versuchen dies mit COALESCE zu umgehen.