You are here

T-SQL Entwicklung: Tabellentransformation - aus Zeileneinträgen Spalten generieren

T-SQL Entwicklung: Tabellentransformation - aus Zeileneinträgen Spalten generieren


Ausgangssituation und Ziel

Sie haben eine SQL Tabelle mit Datumsangaben, Parametern und zugehörigen Werten. Ziel ist es aus den Einträgen der Spalte Parameter zusätzliche Spalten zu generieren.

Quelltabelle und Zieltabelle

Schritt 1: Parameter eindeutig identifizieren

Zunächst ist eine SQL-Abfrage auf der Spalte Parameter der Originaltabelle (ORIG_TABLE) zur eindeutigen Identifizierung der Parameter durchzuführen.

Das Ergebnis ist in einem Cursor zu speichern:

declare PARA_CURSOR SCROLL cursor FOR Select distinct Parameter from [ORIG_TABLE];

Schritt 2: Weitere Variablen zur Verarbeitung anlegen

Für die Verarbeitung sind weitere Variablen erforderlich:

declare @PARAMETER as VARCHAR(150);

declare @sql_statement as NVARCHAR(max);

Schritt 3: Cursor öffnen und T-SQL erstellen

In der Variable @sql_statement wird die Abfrage zur Tabellentransformation generiert. Mit dem open Kommando wird der Cursor geöffnet.

Der Cursor enthält nun jeden Wert aus der Spalte Parameter der Originaltabelle genau einmal.

set @sql_statement = 'SELECT Datum, ';

open PARA_CURSOR;

 

In der folgenden WHILE-Schleife wird die Struktur der Zieltabelle mit Hilfe des Cursors in einem T-SQL Kommando erstellt:

FETCH FIRST FROM PARA_CURSOR INTO @PARAMETER

  WHILE @@FETCH_STATUS = 0 

       BEGIN 

             set @sql_statement = @sql_statement + ', ' + '[' + @PARAMETER + ']';

             FETCH NEXT FROM PARA_CURSOR INTO @PARAMETER

       END

 

Die zuvor erstellte Struktur muss nun noch befüllt werden und in die Zieltabelle DEST_TABLE) überführt werden. Hierfür nutzen wir die T-SQL PIVOT Funktion:

set @sql_statement = @sql_statement + ' FROM (SELECT Datum, Wert, Parameter FROM [ORIG_TABLE]) SourceTable PIVOT (avg(Wert) FOR Parameter IN ('

  FETCH FIRST FROM PARA_CURSOR INTO @PARAMETER

  WHILE @@FETCH_STATUS = 0 

       BEGIN 

             set @sql_statement = @sql_statement + '[' + @PARAMETER + ']' + ', '

             FETCH NEXT FROM PARA_CURSOR INTO @PARAMETER

       END

 

Das letzte zuviel geschriebene Komma aus der While Anweisung entfernen und Cursor schließen:

set @sql_statement = SUBSTRING(@sql_statement,1,(LEN(@sql_statement)-1)) + ')) AS PivotTable

close DPE_CURSOR;

deallocate DPE_CURSOR;

Schritt 4: Prüfung ob Zieltabelle existiert und Ausführung des SQL-Statements

Prüfung: Wenn vorhanden löschen um doppelte Einträge zu vermeiden:

IF OBJECT_ID (N'DEST_TABLE’, N'U') IS NOT NULL

       DROP TABLE DEST_TABLE;

 

Ausführung der T-SQL Anweisung. In der Transformationstabelle ist nun die gewünschte Datenstruktur vorhanden:

 

EXECUTE sp_executesql @sql_statement;