Der Visual Query Builder, kurz VQB genannt, ist ein Bestandteil des SQL-Managers von WINcontact und dient der "visuellen" Erzeugung einfacher Datenbankabfragen über die WINcontact - Datenbank. Er erfordert keine speziellen SQL-Kenntnisse, erzeugt aber am Ende gültigen SQL-Code, der bei Bedarf weiter modifiziert werden kann.
Der VQB als Bestandteil des SQL-Managers
Der SQL-Manager ist im Wesentlichen aus vier separaten Seiten aufgebaut, welche die Bezeichnungen (Reiter) "Visual Query Builder", "Abfrage", "Ergebnis" und "Mitteilungen" tragen. Der VQB steht Ihnen z. B. immer bei der Neuanlage eines Abfrageskriptes zur Verfügung. Es handelt sich dabei um ein interaktives Werkzeug zum Entwurf und zum Testen von SELECT-Anweisungen (damit werden explizit Datenbankabfragen realisiert), mit dem ohne viel Schreibaufwand einfache Datenbankabfragen (darunter auch sogenannte "Joins" sowie Gruppierungen) erstellt werden können. Genaugenommen sind dazu nicht einmal elementare SQL-Kenntnisse notwendig. Der erfahrene Administrator und Supervisor wird dagegen den VQB hauptsächlich dazu verwenden, um sich - und zwar ohne viel zu schreiben - ein Grundgerüst von SQL-Statements im SQL-Editor (Seite "Abfrage") erzeugen zu lassen, die er dann per Hand an die entsprechende Aufgabenstellung anpasst.
Aufbau und Verwendung des VQB
Das Fenster des VQB besteht im Wesentlichen aus 4 Teilen (im Uhrzeigersinn):
- graphischer Verbindungseditor
- Tabellenauswahl
- Parametereditor
- SQL-Anzeige
Wie in jedem relationalen Datenbanksystem befinden sich auch in WINcontact die Informationen in verschiedenen Tabellen, die bei Abfragen oft miteinander verknüpft werden müssen. Nehmen wir z. B. die Adressentabelle. Sie enthält zwar alle wichtigen Stammdaten zu einer Firma oder einer Privatperson, aber keine Kommunikationskanäle wie Telefonnummern, E-Mailadressen oder Faxnummern. Diese Informationen stehen in WINcontact in der Kommunikationstabelle, die über eine 1:n - Beziehung mit der Adressentabelle über den Frendschlüssel ADRESSEN_ID verbunden werden kann. 1:n - Beziehung bedeutet dabei, dass zu einem Adressdatensatz in der Tabelle ADRESSEN beliebig viele (also "n") Kommunikationskanäle in der Tabelle KOMMUNIKATION enthalten sein können. Auf diese Weise können z. B. zu einer Adresse mehrere Telefonnummern gespeichert werden. Gibt es dagegen zu jedem Datensatz in einer Tabelle genau einen Datensatz in einer anderen Tabelle (wie das z. B. zwischen ADRESSEN und der Abarbeitungsliste ALG der Fall ist), dann spricht man von einer 1:1 - Beziehung.
Wie werden nun in WINcontact Verbindungen zwischen unterschiedlichen Tabellen hergestellt? Dazu muss man Folgendes wissen: In WINcontact besitzt jede Tabelle einen sogenannten Primärindex. Er steht immer an erster Stelle und hat den gleichen Namen wie die Tabelle selbst plus einem angehängten „ID“ (ohne Unterstrich!). Ein Fremdschlüssel ist dagegen an der Nachsilbe „_ID“ (mit Unterstrich!) erkennbar. Der Bezeichner davor gibt die Tabelle an, die durch diesen Fremdschlüssel referenziert wird. Das folgende Beispiel stellt eine solche Primär-Fremdschlüsselverbindung über die ADRESSENID zwischen der Adressentabelle und der Abarbeitungsliste her:
Wobei wir zugleich vom Verbindungseditor des VQB Gebrauch gemacht haben. Natürlich können Sie Tabellen auch über gleiche Fremdschlüssel verbinden:
Zu der Namenskonvention Primärschlüssel-Fremdschlüssel gibt es in WINcontact wenige Ausnahmen. Das betrifft u. a. die Tabelle NUTZER in der globalen Datenbank TMGLOBAL. Der Primärschlüssel in dieser Tabelle heißt „NUTZERID“. Referenziert in Fremdtabellen (z. B. der Abarbeitungsliste ALG) wird er dagegen durch den Fremdschlüssel „USER_ID“. Das ist zu beachten, wenn z. B. der Name eines Callagenten, der in einer Tabelle durch den Schlüssel „USER_ID“ explizit eingetragen ist (wie z. B. in der ALG), mit seinem Vollnamen aus der Tabelle NUTZER in einer Abfrage erscheinen soll:

Wobei wir zugleich vom Verbindungseditor des VQB Gebrauch gemacht haben. Natürlich können Sie Tabellen auch über gleiche Fremdschlüssel verbinden:

Zu der Namenskonvention Primärschlüssel-Fremdschlüssel gibt es in WINcontact wenige Ausnahmen. Das betrifft u. a. die Tabelle NUTZER in der globalen Datenbank TMGLOBAL. Der Primärschlüssel in dieser Tabelle heißt „NUTZERID“. Referenziert in Fremdtabellen (z. B. der Abarbeitungsliste ALG) wird er dagegen durch den Fremdschlüssel „USER_ID“. Das ist zu beachten, wenn z. B. der Name eines Callagenten, der in einer Tabelle durch den Schlüssel „USER_ID“ explizit eingetragen ist (wie z. B. in der ALG), mit seinem Vollnamen aus der Tabelle NUTZER in einer Abfrage erscheinen soll:

Jetzt wollen wir uns etwas genauer anschauen, wie derartige Verbindungen zwischen verschiedenen Tabellen im VQB realisiert werden und wie man die in den Tabellen gespeicherten Daten zur Anzeige bringt. Sie wählen aus den Tabellenlisten mit der Maus die jeweils gewünschte Tabelle aus und „schieben“ sie mit gedrückter linker Maustaste auf die Arbeitsfläche respektive Verbindungseditor um sie dort möglichst günstig anzuordnen. Beachten Sie dabei, dass es drei Tabellenlisten gibt, die technisch drei verschiedenen Datenbanken auf dem SQL-Server entsprechen:
Aktuelles Projekt:
Enthält im Wesentlichen die Abarbeitungsliste, die Kontakttabelle und den Fragenkatalog des aktuellen Projektes (d. h., in dessen Auswertungsmodus Sie sich gerade befinden)
Aktueller Mandant:
Enthält u. a. die Stammdaten (Adressen), die Kommunikationstabelle und die dem aktuellen Mandanten zugeordneten Zusatztabellen.
Global:
Enthält alle global verfügbaren Tabellen (d.h. die Tabellen, die weder mandant- noch projektabhängig sind wie z. B. die Nutzertabelle.
Die jeweiligen Datenbanknamen stehen übrigens immer als Präfix vor den Tabellennamen, wodurch eine „absolute“ Referenzierung dieser Tabellen in einer SQL-Anweisung erreicht wird.
Am besten, wir beginnen wieder mit einem Beispiel, um die wichtigsten Funktionen des VQB und deren Zusammenspiel kennenzulernen. Ziel soll es sein, eine Tabelle zu erzeugen, welche alle im Call-Center bereits erledigten Adressen mit Erledigt-Datum und Vollname des Callagenten, der diese Adresse zuletzt bearbeitet hat, auflistet. Um diese Aufgabe zu lösen, benötigen wir drei Tabellen:
ADRESSEN
enthält die Adreßstammdaten (aktueller Mandant)
ALG
Abarbeitungsliste; daraus kann man entnehmen, ob die Adresse bereits erledigt ist, wann sie gegebenenfalls erledigt wurde und wer sie zuletzt bearbeitet hat (aktuelles Projekt)
NUTZER
enthält die Stammdaten der Callagenten (globale Datenbank)
Jetzt können Sie die genannten Tabellen in den Arbeitsbereich ziehen:

Was noch fehlt, sind u. a. die Verbindungen zwischen den einzelnen Tabellen.
Um die Tabelle ADRESSEN mit der Tabelle ALG zu verbinden, markieren Sie mit der Maus den Primärindex in ADRESSEN und „ziehen“ ihn mit gedrückter linker Maustaste zum dazugehörigen Fremdschlüssel ADRESSEN_ID der Tabelle ALG, wo Sie die Maustaste wieder loslassen. Die beiden Schlüsselfelder werden jetzt im Verbindungseditor durch eine Linie verbunden. Da in der Abarbeitungsliste der Callagent explizit nur durch seinen Index in der NUTZER-Tabelle erscheint, muss auch eine Verbindung zu dieser Tabelle hergestellt werden, wenn man deren Namen in der Ergebnistabelle lesen möchte:
{ALG} USER_ID -> {NUTZER} NUTZERID
Jetzt brauchen Sie nur noch die Felder ankreuzen, die aufgelistet werden sollen (siehe Abbildung). Als Ergebnis wird unterhalb des Verbindungseditors eine Tabelle aufgebaut sowie das automatisch erzeugte SQL-Skript angezeigt:

Die Tabelle, die Sie hier sehen, wollen wir „Parametertabelle“ nennen. Ergänzungen darin haben sofort Einfluß auf die generierte SELECT-Anweisung. Schauen Sie sich dazu einmal die letzte Zeile „ERLEDIGT“ an. Bei dieser Zeile wurde das Häkchen aus der Spalte „Ausgabe“ entfernt was bedeutet, dass das ERLEDIGT-Feld in der Ergebnistabelle nicht mehr angezeigt wird (d. h. es fehlt in der SELECT-Liste). Wir benötigen dieses Feld aber, weil darin immer eine „1“ steht, sobald die Adresse im Call-Center „erledigt“ wurde (andernfalls steht in diesem Feld eine „0“). Um also alle „erledigten“ Adressen herauszufiltern, müssen wir in unserem Beispiel die Bedingung „=1“ in die Kriterium-Spalte schreiben.
Bevor wir uns weiter mit der Parametertabelle beschäftigen, sollten wir erst einmal das automatisch erzeugte Skript ausprobieren. Sie brauchen dazu nur auf die Seite „Abfrage“ des SQL-Managers wechseln, wohin er bereits übertragen wurde. Ein Klick auf das rote Ausrufezeichen in der Toolbar veranlasst die Datenbankabfrage und das Resultat ist auf der Seite „Ergebnis“ zu sehen:

Damit haben Sie die grundlegende Arbeitsweise mit dem VQB kennengelernt. Sie müssen aber auf jeden Fall beachten, dass es sich hierbei um ein „one way tool“ handelt. Das bedeutet, wenn Sie im SQL-Editor Änderungen am SQL-Skript vornehmen, dann hat das keine Rückwirkungen auf den Inhalt des VQB. Sie können aber jederzeit (d. h. solange der VQB aktiv ist) in ihn zurückwechseln und dort Änderungen vornehmen. Wenn Sie aber ein Skript in WINcontact speichern und ihn dann später wieder laden, dann steht Ihnen der VQB nicht mehr zur Verfügung und Sie müssen eventuell notwendige Änderungen oder Erweiterungen im Skript selbst vornehmen.
Parametertabelle
Kehren wir jetzt zurück zum VQB und schauen uns an, was er noch so alles kann. In der Parametertabelle gibt es insgesamt folgende Einstellmöglichkeiten:
- Alias - Festlegen von abweichenden Spaltenbezeichnern
- Ausgabe - Spalten ein- und ausblenden
- Sort-Typ - Sortierung bzw. Sortierreihenfolge festlegen
- Sort-Reihenfolge - Felder, nach denen sortiert werden soll, festlegen
- Group by - eventuell Gruppierungskriterium festlegen
Die Spalten „Spalte“ und „Tabelle“ können nicht geändert werden.
Beginnen wir mit der Spalte „Alias“. Wenn Sie hier etwas eintragen, dann wird in der Ergebnistabelle anstelle des Namens des Datenfeldes (Inhalt von „Spalte“) der hier eingetragene Aliasnamen als Spaltenname verwendet. Beachten Sie dabei, dass Sie, wenn Sie mehr als ein zusammenhängendes Wort als Aliasnamen verwenden, die Begriffe in einfache Hochkommas setzen müssen. Auf diese Weise können Sie z. B. der Ergebnistabelle genau die Spaltenbezeichner geben, die Ihnen ihr Auftraggeber vorgegeben hat auch wenn sie mit den WINcontact- Feldnamen nicht übereinstimmen:


Die Spalte „Ausgabe“ haben wir schon kennengelernt. Ein Häkchen darin bewirkt, dass die entsprechende Spalte in der Ergebnistabelle erscheint – andernfalls nicht.
Die beiden nächsten Spalten der Parametertabelle beziehen sich auf die Sortierung der Daten in der Ergebnistabelle. „Sort-Reihenfolge“ bezieht sich dabei, in welcher Reihenfolge nach welchen Spalten sortiert werden soll. Angenommen, wir wollen zuerst nach der Spalte „ORT“ und (innerhalb eines Ortes) anschließend nach „KURZNAME“ sortieren. Dann sehen die Einstellungen in der Parametertabelle folgendermaßen aus:

„1“ bedeutet offensichtlich, dass zuerst nach ORT und „2“ danach nach KURZNAME sortiert wird – und zwar beide Male in aufsteigender Reihenfolge („Ascending“ in „Sort-Typ“). Sie können selbstverständlich die Sortierrichtung für jedes Sortierfeld individuell auf Ascending oder Descending festlegen.
Die Spalte „Group By“ dient der Erstellung gruppierter Abfragen bzw. für Abfragen mit sogenannten Aggregatfunktionen. Wir gehen darauf etwas später noch detailliert ein.
Noch ein paar Worte zur Kriterium-Spalte. In diese Spalten können Sie spezielle Auswahlkriterien eintragen, die im SQL-Skript in der WHERE-Anweisung zum tragen kommen. Solche Auswahlkriterien haben in der Regel die Form
{Operatorzeichen} {Vergleichswert}
Wenn z. B. alle Adressen aus dem Ort „Berlin“ ausgegeben werden sollen, dann wäre das Kriterium
='Berlin'
Beachten Sie, dass Zeichenketten immer in einfache Hochkommas eingeschlossen werden müssen.
Sie können natürlich auch mehrere Kriterien – getrennt durch einen logischen Operator – in das Kriteriumfeld der entsprechenden Spalte eintragen, z. B.
='Berlin' OR A.ORT='Leipzig'
(„A“ ist der Tabellenalias, der bei eindeutigen Feldnamen auch weggelassen werden kann)
Sie müssen lediglich beachten, dass dieses „Kriterium“ u. U. in der generierten SELECT-Anweisung eingeklammert werden muss, damit die OR-Verknüpfung richtig interpretiert wird:
SELECT
A.KURZNAME AS Firmenname,
A.PLZ AS Postleitzahl,
A.ORT,
A.STRASSE AS Straße,
A.HNR AS Hausnummer,
B.ERLDATUM,
C.VORNAME AS Vorname,
C.NACHNAME AS Nachname
FROM TMMANDANT1..ADRESSEN AS A, TMPROJEKT1_1..ALG AS B, TMGLOBAL..NUTZER AS C
WHERE A.ADRESSENID=B.ADRESSEN_ID AND B.USER_ID=C.NUTZERID
AND (A.ORT ='Köln' OR A.ORT='Dresden')AND B.ERLEDIGT=1
ORDER BY A.ORT, Firmenname
Die in diesem Fall nachzutragenden Klammern sind rot dargestellt.
Die vom VQB automatisch erstellte SQL-Abfrage können Sie im SQL-Editor beliebig editieren. Der erfahrene Administrator und Supervisor wird den VQB in den meisten Fällen dazu verwenden, um schnell und ohne übermäßig viel einzutippen ein Grundgerüst für eine komplexe Abfrage zu erhalten, die er dann nur noch seiner Aufgabenstellung anpassen muss. In unserem Beispielskript ist es z. B. ein Leichtes, auf diese Weise den Vornamen und den Nachnamen zur Spalte „Callagent“ zusammenzufassen:
SELECT
A.KURZNAME AS Firmenname,
A.PLZ AS Postleitzahl,
A.ORT,
A.STRASSE AS Straße,
A.HNR AS Hausnummer,
B.ERLDATUM,
C.VORNAME +' '+ C.NACHNAME AS Callagent
FROM TMMANDANT1..ADRESSEN AS A, TMPROJEKT1_1..ALG AS B, TMGLOBAL..NUTZER AS C
WHERE A.ADRESSENID=B.ADRESSEN_ID AND B.USER_ID=C.NUTZERID
AND (A.ORT='Köln' OR A.ORT='Dresden') AND B.ERLEDIGT=1
ORDER BY A.ORT, Firmenname
Verbindungseditor
Der Visual Query Builder erlaubt über Primär-Fremdschlüssel und Fremdschlüssel-Fremdschlüssel-beziehungen verschiedenste Tabellen miteinander zu verknüpfen. Damit dabei auch die gewünschten Ergebnisse herauskommen, sind einige Dinge zu beachten. Das betrifft allein schon die Tatsache, daß Transact SQL verschiedene Arten von Verknüpfungen, die man in SQL als „Joins“ (deutsch „Verbund“) bezeichnet, unterstützt. Der VQB erlaubt z. B. die Erstellung von sogenannten Equijoins sowie von äußeren Verknüpfungen (OUTER JOINS). Aber auch die selten verwendeten Theta-Joins werden unterstützt. Selbstverknüpfungen sind dagegen nicht möglich. Sie können aber leicht per Hand im SQL-Editor erstellt werden.
Bei Equijoins handelt es sich um einfache Verknüpfungen von Tabellen, bei denen die Gleichheit von Schlüsselfeldern geprüft wird, z. B. A.ADRESSENID=B.ADRESSEN_ID.
Im Verbindungseditor brauchen in diesem Fall nur die entsprechenden Schlüsselfelder mit der Maus miteinander verbunden werden. Die Ergebnistabelle enthält am Ende jedoch nur Daten, bei denen sowohl in der Tabelle A als auch in der damit verknüpften Tabelle B Datensätze vorliegen.
Interessanter sind da schon die sogenannten OUTER JOINS. Auch hier werden z.B. zwei Tabellen A und B über eine eindeutige Schlüsselbeziehung miteinander verknüpft. Bei einem LEFT OUTER JOIN werden z. B. alle Datensätze der Tabelle A aufgelistet, auch wenn es in der Tabelle B dafür keine Datensätze gibt. Bei einem RIGHT OUTER JOIN ist es genau anders herum: Alle Datensätze der Tabelle B werden aufgelistet, auch wenn es in A keine damit verbundenen Datensätze gibt.
Wenn Sie dagegen möchten, dass sämtliche Zeilen aus beiden Tabellen in der Ergebnistabelle erscheinen sollen, dann ist ein FULL OUTER JOIN zu realisieren.
Outer Joins sind aber nur sinnvoll, wenn die beiden zu verbindenden Tabellen zwar über eine Schlüsselbeziehung verknüpft, aber unterschiedlich viele Datensätze enthalten. Außerdem kann durch eine ungünstig formulierte WHERE-Anweisung im SQL-Skript der Effekt wieder aufgehoben werden. Außerdem ist noch zu beachten, dass, wenn mehrere Tabellen durch derartige Joins verknüpft werden, die Ergebnistabelle empfindlich von der Reihenfolge und Art der Joins zwischen den Tabellen abhängt. Gegebenenfalls müssen Sie verschiedene Abfragen ausprobieren, um das gewünschte Ergebnis zu erhalten.
Wie werden nun OUTER JOINS im Verbindungseditor realisiert? Legen Sie dazu die ADRESSEN-Tabelle des aktuellen Mandanten und die Tabelle ALG (Abarbeitungsliste) des aktuellen Projekts auf die Arbeitsfläche des VQB (um den Effekt zu sehen, sollte die ALG aber nicht alle Adressen des Mandanten enthalten). Anschließend verbinden Sie mit Hilfe der Maus den Primärindex ADRESSENID der Adressentabelle mit dem Fremdschlüssel ADRESSEN_ID der Abarbeitungsliste:

Auf diese Weise entsteht ein Equijoin (Abfrage bitte ausprobieren -> es werden nur Datensätze angezeigt, die in beiden Tabellen den gleichen Adressenschlüssel haben).
Achten Sie bitte jetzt auf das rautenförmige Kästchen in der Mitte der Verbindungslinie zwischen den Schlüsselfeldern. Dieses Kästchen können Sie mit der rechten Maustaste anklicken, worauf sich folgendes Kontextmenü öffnet:

Die beiden Einträge „Alle Zeilen …“ können separat „angekreuzt“ werden, wodurch die Abfrage in einen OUTER JOIN umgewandelt wird:

„LEFT OUTER JOIN“

„RIGHT OUTER JOIN“

„FULL OUTER JOIN“
Sie sollten jetzt diese drei Fälle einmal ausprobieren und sich jeweils die Ergebnistabelle ansehen. Achten Sie auch auf die Form der „Verbindungsraute“. Sie zeigt die Art des Joins an:

Mit dem VQB können auch die selten verwendeten Theta-Joins (das sind Joins, wo die Verbindung der Schlüsselfelder nicht mit dem „=“-Vergleichsoperator erfolgt) erstellt werden. Um solch einen Join zu erstellen, brauchen Sie nur auf den Verbindungsknoten zu klicken und aus dem Kontextmenü den Eintrag „Eigenschaften“ auszuwählen. Im oberen Teil des daraufhin erscheinenden Dialogfensters können Sie dann in der Klappbox einen geeigneten Vergleichssoperator zwischen den Schlüsselfeldern auswählen:
Tabellenalias ändern
Tabellenalias ändern
Da es vorkommen kann, dass zwei zu verbindende Tabellen jeweils Felder mit gleichem Namen enthalten, muss in einer Abfrage vor den Feldbezeichnern i.d.R. noch der Tabellenname oder zumindes ein Tabellenalias mit angegeben werden. Der VQB vergibt automatisch Tabellenaliase, die mit A beginnen und mit jeder weiteren Tabelle sich mit B, C, D ... fortsetzen. Um im VQB einer Tabelle einen eigenen Aliasnamen zuzuordnen, brauchen Sie nur mit der Maus auf den Header der „Tabelle“ im Verbindungseditor zu klicken und über die rechte Maustaste das Kontextmenü zu öffnen:

Die Funktion „Tabellen-Alias ändern“ öffnet einen kleinen Eingabedialog, in dem Sie einfach den neuen Aliasnamen eintragen:

Den Effekt erkennen Sie, wenn Sie sich anschließend die generierte SQL-Anweisung ansehen.
Gruppierung von Datensätzen
Sehr häufig benötigt man einfache statistische Informationen über ein Projekt. In vielen Fällen lassen sie sich über sogenannte „Gruppierungen“ aus den Datenbanktabellen extrahieren. Am besten lässt sich das wieder an einem Beispiel erklären. Angenommen, Sie möchten wissen, wie viele Adressen unter den einzelnen Kontaktstati in ihrem Projekt abgespeichert sind. Dazu müssen Sie die Tabelle ALG (Abarbeitungsliste) befragen, in der bei jeder bearbeiteten Adresse im Feld LAST_STATUS jeweils der letzte Kontaktstatus gespeichert ist. Die Einstellungen im VQB sind schnell vorgenommen:


Wichtig ist, dass das Markierungsfeld „GROUP BY-Klausel verwenden“ angekreuzt ist. Nur dann können Sie in der „Group By“-Spalte der Parametertabelle das Gruppierungsfeld festlegen und die gewünschte Aggregatfunktion auswählen.
Gegenüber einer „normalen“ Abfrage erkennen Sie folgende Unterschiede:
- Es wurden (in diesem Fall) nur zwei Felder ausgewählt (ADRESSEN_ID, LAST_STATUS)
- Im Tabellenbereich wurde das Feld LAST_STATUSals Gruppierungsfeld („Group by“) festgelegt
- Das Feld ADRESSEN_ID wird als Zählfeld („Count“) verwendet und die Ergebnisse entsprechend absteigend („Descending“) sortiert (in diesem Fall wäre auch jedes andere Feld geeignet gewesen)
- Die Spalten in der Ergebnistabelle erhalten einen anderen Namen, der ihre Bedeutung verständlicher macht
- Das Kriterium „ <> "" bei LAST_STATUS soll die Ausgabe „leerer“ Datensätze verhindern (hier ist eine Änderung im SQL-Skript erforderlich)
Als Ergebnis ergibt sich folgendes SQL-Skript:
SELECT COUNT(A.ADRESSEN_ID) AS Anzahl,
A.LAST_STATUS AS 'KontaktStatus'
FROM TMPROJEKT3_1..ALG AS A
WHERE 'Kontaktstatus'<>''
GROUP BY A.LAST_STATUS
ORDER BY 'KontaktStatus' DESC
wobei die WHERE-Anweisung in WHERE LAST_STATUS<>'' geändert werden sollte. Auch ein Umsortieren der SELECT-Liste ist durchaus sinnvoll:
SELECT A.LAST_STATUS AS 'Kontaktstatus', COUNT(A.ADRESSEN_ID) AS Anzahl
Die Ergebnistabelle sieht dann ungefähr so aus:

Beachten Sie aber, dass das Editieren des Skriptes keine Rückwirkungen auf den VQB hat, so dass Änderungen darin die manuellen Änderungen im Skript wieder zunichte machen.
Natürlich können Sie in einer Gruppierung auch geeignete Felder aus anderen Tabellen mit anzeigen lassen. Angenommen, Sie möchten mit dem WINcontact –Reportdesigner einen Druckbeleg erzeugen, welches für jeden Callagenten die Anzahl der einzelnen Kontaktstati, die er in einem Projekt realisiert hat, ausgibt. In diesem Fall muss die globale Tabelle NUTZER in die Abfrage mit einbezogen werden, da nur darin die Vollnamen der Callagenten enthalten sind. Die Verbindung der beiden Tabellen erfolgt über die Schlüsselbeziehung NUTZERID -> USER_ID. Die Sortierung erfolgt über NACHNAME und darin über den LAST_STATUS. Auch hier werden alle Datenfelder ohne LAST_STATUS aus der Abfrage über das Kriterium „<>'' entfernt:


Das Kriterium bei TYP („ =4 „) bewirkt, dass nur Callagenten in der Gruppierung aufgelistet werden und die Einbeziehung des Erledigt-Datums dient der parametrisierten Auswahl eines Datumsbereiches. Da der Datumsbereich frei gewählt werden soll, werden die Parameter „ :von „ und „ :bis „ in der Abfrage verwendet. Dabei bezeichnet der Doppelpunkt unmittelbar vor einem Bezeichner einen WINcontact –Parameter. Sie erzwingen das Aufblenden eines Parameter-fensters, worin der Nutzer den Datumsbereich festlegen kann. Im SQL-Skript wird die Auswahl des Datumsbereichs durch das Kriterium „ BETWEEN :von AND :bis „ realisiert.
Auch hier ist es sinnvoll, das automatisch erzeugte SQL-Skript im SQL-Editor manuell anzupassen:
SELECT
B.VORNAME+' '+B.NACHNAME AS Callagent,
A.LAST_STATUS AS 'Kontaktstatus',
COUNT(A.ADRESSEN_ID) AS Anzahl
FROM TMPROJEKT3_1..ALG AS A, TMGLOBAL..NUTZER AS B
WHERE A.USER_ID=B.NUTZERID
AND A.ERLDATUM BETWEEN :von AND :bis
AND A.LAST_STATUS<>''
AND B.TYP=4 -- nur Callagenten
GROUP BY A.LAST_STATUS, B.VORNAME, B.NACHNAME
ORDER BY 'Kontaktstatus'
Die Ergebnisliste hat dann folgendes Aussehen:

Neben der häufig gebrauchten Aggregatfunktion COUNT, die in unseren Beispielen zum Einsatz kam, können in einer Gruppierungsabfrage auch noch andere Aggregatfunktionen zum Einsatz kommen.
Das betrifft im Einzelnen:
SUM Aufsummieren der Werte einer Spalte
MIN Kleinster Wert in der Spalte
MAX Größter Wert in der Spalte
AVG Mittelwert der Spalteninhalte
Diese Funktionen sind jedoch i. d. R. nur für numerische Spalten geeignet.
Mit dem VQB können relativ leicht einfache Abfragen über die WINcontact –Datenbanken zusammen geklickt werden. Selbst einfache Gruppierungen und parametrisierte Abfragen sind mit etwas Übung relativ leicht zu erstellen. In den meisten Fällen wird man aber nicht umhinkommen, die von diesem Tool erzeugten SQL-Skripte nachträglich im SQL-Editor des SQL-Managers anzupassen (wie im obigen Beispiel geschehen). Das betrifft in den meisten Fällen lediglich ein Umsortieren der SELECT-Liste oder der Anpassung und Ergänzung einer WHERE-Anweisung.
Der erfahrene Anwender wird den VQB hauptsächlich zum schnellen Erzeugen von Abfragegerüsten verwenden, weil man dadurch viel Schreibarbeit spart. Diese „Templates“ werden dann im SQL-Editor weiterbearbeitet und soweit verändert, bis die Abfrage die gewünschten Ergebnisse liefert.
Keine Kommentare:
Kommentar veröffentlichen