Passa ai contenuti principali

SQL Pivot e Unpivot




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:
IDAnnoVenditoreAmmontare
12009Marco143,3
22009Andrea129
32009Carlo90,5
42009Roberto111
52009Luigi120,1
62008Marco130,7
72008Andrea170,9
82008Carlo167
Qui il codice per popolare la tabella:


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:
AnnoTotaleVendite
2009593,9
2008720,2
2007522,2
2006452,9
Ma quello che ci serve ora è ottenere un'analisi "per anno", qualcosa del genere:

2006200720082009
452,9522,2720,2593,9
Si noti che i valori relativi a gli anni della tabella varieranno nel tempo. La dinamicità di costruzione delle colonne della tabella precedente mediante sta nel fatto che i valori del campo Year della tabella ancora prima costituiranno le colonne della tabella.


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.



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

Commenti

Post popolari in questo blog

Telecamere Ip con accesso "nascosto"

Telecamere Ip con accesso "nascosto" Storia triste di un auto-hacking obbligato che mi ha fatto scoprire come la nostra privacy è realmente messa a rischi. Storia Ho acquistato dal mercatino/fiera del Radioamatore di Fasano quattro telecamere IP. La scatola riporta "Smart Camera" LF4810. Ne ho montata una e testata in tutte le sue funzionalità per oltre un mese. Chiaramente la manualistica scarsissima, come da tradizione in questi prodotti cinesi di costo molto concorrenziale, consiste in un "pieghevole" di 4 facciate. Chiaramente non erano documentate le impostazioni necessarie per attivare i protocolli ONVIF e RTSP che mi sono indispensabili per l'uso che ne devo fare. Nonostante questa scarsa documentazione dopo l'installazione base fatta con l'apposita app: tutto sembrava corretto. Chiaramente la prima azione che ho compiuto è stata quella di cambiare la password che di default è "123". Subito dopo h...

Dynamic DNS con Duckdns.org in HTTPS

Obiettivo Avere un dominio https con certificato valido da usare come endpoint pubblico per Homeassistant e per un WebHook per i bot telegram. Fase 1 Registrazione del dominio in un servizio di dynamic DNS come https://www.duckdns.org/   : Scegliere per quale sistema operativo installare il client che si occuperà dell'aggiornamento dell'ip: Seguire la semplice guida per la configurazione del processo cron: Fase 2 Creazione del certificato e installazione sul server. Di tutto questo si occuperà una applicazione che si chiama certbot. $ sudo add-apt-repository ppa:certbot/certbot $ sudo apt install python-certbot-apache $ sudo certbot --apache -d ol3.duckdns.org -d www.ol3.duckdns.org Fase 3 Esporre il servizio https sulla rete pubblica. Aprire o reindirizzare la porta 443 verso l'host sul quale si è fatta la configurazione di certbot dal proprio router. Il certificato di certbot è valido per novanta giorn...

JHipster - Uso base

Cosa è JHipster è un "generatore di applicazioni" che fornisce tutto lo stack necessario ad implementare una applicazione web e/o a microservizi basata su Spring Boot e AngularJs. E' dotato di un marketplace di componenti già pronte: https://www.jhipster.tech/#modules E' dotato di uno strumento web per la modellazione dello schema E-R: https://start.jhipster.tech/jdl-studio/ Prerequisiti - Java 8  - Node.js (usare la versione LTS 64-bit) - NPM viene installato con Node.js ma va aggiornato      $ npm install -g npm - Per usare il JHipster Marketplace, installare Yeoman:       $ npm install -g yo Uso base Gli step, presi dal sito ufficiale sono questi: 1. Installare JHipster:       $ npm install -g generator-jhipster Nota: per installare una versione specifica del generator:   $ npm install -g generator-jhipster@6.0.5 2. Crea una nuova directory ed entra dentro questa:   $ mkdir ...