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:

SQL Server Dynamische Kreuztabelle Entwurf

Wenn man jetzt ein bestimmtes Merkmal, wie zum Beispiel die Partei­zu­ge­hörig­keit 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:

SQL Server Dynamische Kreuztabelle Ergebnis

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.

SQL Server Dynamische Kreuztabelle Ergebnis SQL Server

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:

SQL Server Dynamische Kreuztabelle Table President

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

Kommentare

Neuen Kommentar schreiben