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.
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;