PIVOT e UNPIVOT SQL
(Le tabelle ed il codice è preso da un articolo di HTML.it)
Spesso serve avere delle tabelle o viste costruite dinamicamente: le colonne che si vogliono rappresentate sono definite mediante i valori di una specifica tabella.
Con SQL Server 2005 e con Oracle 11g si hanno a disposizione questi due nuovi operatori: PIVOT e UNPIVOT.
Una tabella utile al nostro scopo potrebbe essere:
Qui il codice per crearla:
| 
CREATE TABLE Vendite(
 ID INT NOT NULL,
 Anno INT NOT NULL,
 Venditore VARCHAR(50) NOT NULL,
 Ammontare FLOAT NOT NULL
)
ALTER TABLE Vendite ADD (
  CONSTRAINT dept_pk PRIMARY KEY (ID));
  
 CREATE SEQUENCE dept_seq START WITH 1; 
 
 
CREATE OR REPLACE TRIGGER dept_bir 
BEFORE INSERT ON Vendite 
FOR EACH ROW
BEGIN
  SELECT dept_seq.NEXTVAL
  INTO   :new.id
  FROM   dual;
END;  | 
Si ipotizzi di avere questi dati racconti in tabella:
| ID | Anno | Venditore | Ammontare | 
|---|---|---|---|
| 1 | 2009 | Marco | 143,3 | 
| 2 | 2009 | Andrea | 129 | 
| 3 | 2009 | Carlo | 90,5 | 
| 4 | 2009 | Roberto | 111 | 
| 5 | 2009 | Luigi | 120,1 | 
| 6 | 2008 | Marco | 130,7 | 
| 7 | 2008 | Andrea | 170,9 | 
| 8 | 2008 | Carlo | 167 | 
| … | … | … | … | 
| … | … | … | … | 
Qui il codice per popolare la tabella:
Aggregando per anno mediante:
| 
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2009, 'Marco', 143.3);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2009, 'Andrea', 129);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2009, 'Carlo', 90.5);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2009, 'Roberto', 111);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2009, 'Luigi', 120.1);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2008, 'Marco', 130.7);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2008, 'Andrea', 170.9);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2008, 'Carlo', 167);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2008, 'Roberto', 120.6);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2008, 'Luigi', 131);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2007, 'Marco', 112.5);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2007, 'Andrea', 140.2);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2007, 'Carlo', 132);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2007, 'Luigi', 137.5);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2006, 'Marco', 135.5);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2006, 'Andrea', 99);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2006, 'Carlo', 102.4);
INSERT INTO Vemdite(Anno, Venditore, Ammontare) VALUES (2006, 'Luigi', 116); | 
Aggregando per anno mediante:
| SELECT Anno, SUM(Ammontare) as TotaleVendite 
FROM Vemdite 
GROUP BY Anno
ORDER BY Anno DESC; | 
si ottiene:
| Anno | TotaleVendite | 
|---|---|
| 2009 | 593,9 | 
| 2008 | 720,2 | 
| 2007 | 522,2 | 
| 2006 | 452,9 | 
Ma quello che ci serve ora è ottenere un'analisi "per anno", qualcosa del genere:
| 2006 | 2007 | 2008 | 2009 | 
|---|---|---|---|
| 452,9 | 522,2 | 720,2 | 593,9 | 
Per agevolare questa operazione, ottenibile anche con comandi SQL molto più complessi si è fornito l'operatore PIVOT:
| SELECT * FROM
(SELECT Anno, Ammontare
FROM Vemdite)
PIVOT
( 
SUM(Ammontare)
    FOR Anno IN (2006, 2007, 2008, 2009)
) | 
L'operazione speculare è l'UNPIVOT che ruota le colonne in righe.

Quest'opera è distribuita con Licenza Creative Commons Attribuzione - Condividi allo stesso modo 4.0 Internazionale.


Commenti
Posta un commento