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

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