Manche Männer bemühen sich lebenslang, das Wesen einer Frau zu verstehen. Andere befassen sich mit weniger schwierigen Dingen z. B. der Relativitätstheorie. - Albert Einstein
emde IT-LÖSUNGEN
> Tel. 08131 / 99 69 80-0
> Kontakt per E-Mail
Dynamische Kreuztabelle mit dem MS-SQL-Server
28. Mai 2013
Kreuztabellenabfragen mit Microsoft Access
In Access gibt es eine ganz wunderbare Möglichkeit, mit sogenannten Kreuztabellenabfragen Auswertungen zu erzeugen, bei denen Tabelleninhalte zu Spaltentiteln werden.
Hierzu das folgende Beispiel: Gegeben sei eine Tabelle mit einigen Daten amerikanischer Präsidenten. Zum besseren Verständnis hier ein Ausschnitt dieser Tabelle:
Wenn man jetzt ein bestimmtes Merkmal, wie zum Beispiel die Parteizugehörigkeit der Präsidenten, in einer Abfrage als Spaltentitel haben möchte, dann kann man eben mit einer Kreuztabellenabfrage dieses einfach erreichen. Der folgende ScreenShot zeit das Entwurfsfenster einer solchen Abfrage:
Wird die obige Abfrage ausgeführt, so bekommt man das untenstehende Ergebnis. Man beachte die nette Spielerei mit den automatisch erzeugten Summen, die man ab Access 2007 als Ergebnszeile definieren kann.
Es ist wirklich faszinierend, wie leicht man auf diese Art und Weise Auswertungen erzeugen kann. Die Spaltenüberschriften werden dynamisch gemäß den Daten in den zugrundeliegenden Tabellen generiert. Ist einem das zu dynamisch, kann man auch feste Spaltenüberschriften in den Eigenschaften der Abfrage hinterlegen; alles in allem also ein perfektes Werkzeug.
Die Situation auf dem MS-SQL-Server
Auf dem SQL-Server von Microsoft muss man grundsätzlich die Spaltentitel einer Kreuztabellenabfrage zu dem Zeitpunkt kennen, an dem eine solche Abfrage erstellt wird. Dies entspricht den oben erwähnten festen Spaltentiteln unter Access.
Die Syntax einer Kreuztabellenabfrage für das obige Beispiel sieht auf dem SQL-Server dann folgendermaßen aus:
SELECT * FROM (SELECT PRES_NAME, PARTY, STATE_BORN FROM PRESIDENT) AS P PIVOT (COUNT (PRES_NAME) FOR PARTY IN ([Democratic], [Demo-Rep], [Federalist], [Republican], [Whig] )) AS Q
Das Ergebnis dieser Abfrage erscheint im SQL Server Management Studio wie folgt:
Soll der SQL-Server nun dynamisch die vorkommenden Spaltentitel ausgeben, so bleibt einem nichts anderes übrig, als das entsprechende SQL-Statement im Rahmen einer Prozedur zusammenzubasteln und dieses dann per Execute auszuführen. Wie man das macht, zeigt das untenstehende hoffentlich selbsterklärende Beispiel:
PROCEDURE [dbo].[Dynamische PIVOT-Tabelle mit EXECUTE] AS BEGIN DECLARE @X varchar(1000); DECLARE @S varchar(20); DECLARE @ERSTER int; DECLARE C CURSOR FOR SELECT DISTINCT PARTY FROM President; SET @X = 'SELECT * ' SET @X = @X + 'FROM (SELECT PRES_NAME, PARTY, STATE_BORN FROM PRESIDENT) P ' SET @X = @X + 'PIVOT (COUNT (PRES_NAME) ' SET @X = @X + 'FOR PARTY IN (' SET @ERSTER = -1; OPEN C; FETCH C INTO @S; WHILE (@@FETCH_STATUS=0) BEGIN IF @Erster = -1 set @Erster = 0; ELSE SET @X = @X + ', '; SET @X = @X + '[' + @S + ']'; FETCH C INTO @S; END CLOSE C DEALLOCATE C SET @X = @X + ')) Q ' PRINT @X EXECUTE (@X); END