SQL Server UNPIVOT Beispiel

Mit diesem T-SQL-Beispiel können Sie dank der SQL Server UNPIVOT Funktion ganz einfach Spalten in Zeilen umwandeln.

Es ist das genaue Gegenteil der PIVOT-Abfrage. In diesem Beispiel werden nur die ersten sechs Monate des Jahres als Spalten verwendet, nämlich Januar bis Juni. Sie können jedoch die Abfrage auf alle 12 Perioden des Jahres erweitern, indem Sie die fehlenden hinzufügen.

1. Daten erstellen, um sie mit dem UNPIVOT-Operator in Zeilen umzuwandeln

Die SQL Server Verkaufstabelle enthält beispielsweise eine Typspalte und die Monatsspalten. Diese enthalten jeweils den Typ und den Betrag der Verkäufe für den Monat. Zum Starten kopieren und fügen Sie einfach die SQL-Abfrage für die Tabellenerstellung in SSMS ein.

Zuerst erstellen Sie die Beispieltabelle mit diesem Skript, kopieren und fügen Sie das Beispiel einfach in Ihr SQL Server Management Studio Fenster ein.

-- Zuerst löschen Sie die Tabelle Verkäufe nach Monat, falls sie bereits in der DB existiert
IF EXISTS( 
	SELECT 1 FROM sys.objects
     WHERE object_id = object_id(N'[dbo].[SALES_BY_MONTH]')
		AND type in (N'U') )
-- BEGIN DROP TABLE [dbo].[SALES_BY_MONTH]
END;

-- Erstellen Sie die VERKAUFE Tabelle
CREATE table [dbo].[SALES_BY_MONTH] (
    [SalesType] NVARCHAR(20),
    [January] NUMERIC(5),
    [February] NUMERIC(5),
    [March] NUMERIC(5),
    [April] NUMERIC(5),
    [May] NUMERIC(5),
    [June] NUMERIC(5)
);

2. Daten in die Quelltabelle einfügen, um sie zu transformieren

Als Nächstes fügen Sie die Daten in die Tabelle ein, die transponiert werden soll. Jede SQL-Dateneinfügung fügt 12 neue Verkaufsbeträge hinzu. Eine Spalte pro Monat, mit dem zugehörigen Verkaufstyp.

Fügen Sie die fehlenden Monate hinzu, falls nötig. So können Sie die 12 Monate des Jahres in einer einzigen SQL Server Abfrage von Spalten in Zeilen umwandeln.

-- Einfügen von Beispielsdaten für jeden Monat: d.h. von Januar bis Juni
-- Die Monatsspalten werden von Spalten in Zeilen umgewandelt
INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Sales', 1000, 2000, 3000, 4000, 5000, 6000);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Discounts', 100, 200, 300, 400, 500, 600);

INSERT INTO dbo.SALES_BY_MONTH ( [SalesType], [January], [February], [March], [April], [May], [June] )
VALUES ( N'Offers', 10, 20, 30, 40, 50, 60);

-- Überprüfen Sie die eingefügten Zeilen in der Verkaufstabelle
SELECT * 
FROM   dbo.SALES_BY_MONTH;
Daten einfügen, um sie mit T-SQL UNPIVOT von Spalten in Zeilen zu transformieren
Daten einfügen, um sie mit T-SQL UNPIVOT von Spalten in Zeilen zu transformieren

3. SQL Server UNPIVOT-Abfrage, um Spalten in Zeilen umzuwandeln

Schließlich besteht die SQL Server UNPIVOT-Funktion aus 3 verschiedenen Schritten, um die Spalten in Zeilen zu transponieren.

  1. Die Auswahl der 3 Ergebnisspalten, d.h. Typ, Monat und Betrag.
  2. Dann die SQL-Unterabfrage mit der ursprünglichen Datenauswahl.
  3. Die UNPIVOT-Operation selbst mit den 6 explizit benannten Monaten.
-- UNPIVOT Spalten zu Zeilen mit SQL-Abfrage
SELECT [TYPE], Monat, Betrag
FROM (	
	SELECT [TYPE], [January], [February], [March], [April], [May], [June]
	FROM dbo.SALES_BY_MONTH 	) sbm
UNPIVOT
   (Betrag FOR Monat IN 
      ([January], [February], [March], [April], [May], [June])
)AS SalesUnPivot;
SQL Server UNPIVOT Beispielabfrage in SSMS
SQL Server UNPIVOT Beispielabfrage in SSMS

Über die PIVOT- und UNPIVOT-Operatoren von SQL Server

Falls Sie immer noch Schwierigkeiten mit diesem SQL Server UNPIVOT-Operator und seiner Syntax haben, kopieren und fügen Sie einfach das Beispiel ein und wiederholen die drei Schritte, indem Sie sie an Ihren realen Fall anpassen. Beginnen Sie damit, die Spalten umzubenennen, um zu verstehen, wie es funktioniert. Abschließend ist die offizielle Microsoft-Dokumentation für die unpivot-Funktion verfügbar. UNPIVOT ist das Gegenteil der PIVOT-Funktion, hier ist ein weiteres kurzes Tutorial zur Verwendung der SQL Server PIVOT-Funktion.

Be the first to comment

Leave a Reply

Your email address will not be published.


*