SQL Server i PIVOT UNPIVOT
<right>Łukasz Lechert</right>
SQL Server udostępnia programiście rozszerzenia polecenia SELECT. Są nimi PIVOT i UNPIVOT. Rozszerzenie PIVOT pozwala na wygodne formatowanie wierszy tabeli oraz prezentacje przekształceń w kolumnach. UNPIVOT jest rozszerzeniem o odwrotnym działaniu oraz przekształca kolumny w wiersze.
Dane
Rozwiązanie dla SQL Server 2000
PIVOT od wersji SQL Server 2005 przekształcanie wierszy w kolumny (sumy)
UNPIVOT - operacja odwrotna
SQL Server udostępnia programiście rozszerzenia polecenia SELECT. Są nimi PIVOT i UNPIVOT. Rozszerzenie PIVOT pozwala na wygodne formatowanie wierszy tabeli oraz prezentacje przekształceń w kolumnach. UNPIVOT jest rozszerzeniem o odwrotnym działaniu oraz przekształca kolumny w wiersze.
Dane
CREATE TABLE Artykul ( id INT, Nazwa VARCHAR(30), Region tinyint, Cena DECIMAL(10,2) ) INSERT INTO Artykul VALUES ( 1, 'BMW Z3', 1, 9000.99 ) INSERT INTO Artykul VALUES ( 2, 'BMW Z4', 1, 19000.99 ) INSERT INTO Artykul VALUES ( 3, 'Audi A4', 2, 11000.99 ) INSERT INTO Artykul VALUES ( 4, 'Audi A6', 2, 15000.99 ) INSERT INTO Artykul VALUES ( 5, 'Mercedes A160', 3, 10000.99 ) INSERT INTO Artykul VALUES ( 6, 'Mercedes CLK', 3, 18000.00 ) INSERT INTO Artykul VALUES ( 7, 'Fiat Panda', 3, 7600.99 ) INSERT INTO Artykul VALUES ( 8, 'Audi Quattro', 1, 8200.00 ) INSERT INTO Artykul VALUES ( 9, 'Golf 5', 3, 8900.99 ) INSERT INTO Artykul VALUES ( 10, 'Ford Focus', 1, 10000.99 )
Rozwiązanie dla SQL Server 2000
SELECT SUM(CASE WHEN Region = 1 THEN Cena ELSE 0 END) AS [1], SUM(CASE WHEN Region = 2 THEN Cena ELSE 0 END) AS [2], SUM(CASE WHEN Region = 3 THEN Cena ELSE 0 END) AS [3] FROM Artykul; -- Sumy -- Region 1=46202,97 Region 2=26001,98 Region 3=44502,97
PIVOT od wersji SQL Server 2005 przekształcanie wierszy w kolumny (sumy)
SELECT 'Suma cen z oferty poszczegolnych regionow' AS RegionOferta, [1] AS Region1, [2] AS Region2, [3] AS Region3 FROM (SELECT Region, Cena FROM dbo.Artykul) AS TabelaArtykulow PIVOT ( SUM(Cena) FOR Region IN ([1],[2],[3]) ) AS PivotCen
UNPIVOT - operacja odwrotna
CREATE TABLE Ceny ( id tinyint, Region1 DECIMAL(10,2), Region2 DECIMAL(10,2), Region3 DECIMAL(10,2) ) -- Dane INSERT INTO Ceny VALUES ( 1, 46202.97, 26001.98, 44502.97 ) SELECT Region, Suma FROM (SELECT Region1, Region2, Region3 FROM dbo.Ceny) AS TabelaCen UNPIVOT ( Suma FOR Region IN (Region1, Region2, Region3) ) AS UnpivotCen