Transact-SQL: L’operatore ROLLUP
Transact-SQL: L’operatore ROLLUP
L’operatore ROLLUP aggiunge ai record generati dal GROUP BY i totali relativi ai raggruppamenti, ed il totale generale dei valori calcolati. Non costruisce l’intero cubo su tutte le combinazioni dei campi inseriti nel GROUP BY, ma segue l’ordine del GROUP BY in questo modo:
SELECT , , SUM(
FROM
GROUP BY ,, WITH ROLLUP
Come per il CUBE questa versione viene definita Non-ISO-Compliant dalla Microsoft e da SQL Server 2008 la sua sintassi è:
SELECT , , SUM(
FROM
GROUP BY ROLLUP(,,)
Riprendendo lo stesso esempio fatto il CUBE:
CREATE TABLE VENDITE (AGENTE VARCHAR(20), PRODOTTO VARCHAR(20), PAESE VARCHAR(20), QUANTITA INT)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'PS3', 'ITALIA', 20)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'PS3', 'SPAGNA', 30)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'PS3', 'FRANCIA', 10)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'PS3', 'GERMANIA', 15)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'WII', 'ITALIA', 10)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'WII', 'SPAGNA', 25)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'WII', 'INGHILTERRA', 8)
INSERT INTO VENDITE VALUES ('AGENTE 1', 'WII', 'GERMANIA', 35)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'PS3', 'ITALIA', 22)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'PS3', 'SPAGNA', 32)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'PS3', 'FRANCIA', 16)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'PS3', 'GERMANIA', 19)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'WII', 'ITALIA', 23)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'WII', 'SPAGNA', 14)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'WII', 'INGHILTERRA', 7)
INSERT INTO VENDITE VALUES ('AGENTE 2', 'WII', 'GERMANIA', 33)
dove ogni Agente figura con la quantità venduta per prodotto e nazione.
La query
SELECT AGENTE, PRODOTTO, PAESE, SUM(QUANTITA)
FROM VENDITE
GROUP BY AGENTE, PRODOTTO, PAESE WITH ROLLUP
restituisce un record con la somma del campo quantità per ogni raggruppamento in ordine di GROUP BY, quindi (AGENTE) e (AGENTE/PRODOTTO), visto che (AGENTE/PRODOTTO/PAESE) è una totalizzazione che viene già generata dal GROUP BY. Ecco il risultato (in grassetto i campi aggiunto da WITH ROLLUP):
AGENTE 1 PS3 FRANCIA 10
AGENTE 1 PS3 GERMANIA 15
AGENTE 1 PS3 ITALIA 20
AGENTE 1 PS3 SPAGNA 30
AGENTE 1 PS3 NULL 75
AGENTE 1 WII GERMANIA 35
AGENTE 1 WII INGHILTERRA 8
AGENTE 1 WII ITALIA 10
AGENTE 1 WII SPAGNA 25
AGENTE 1 WII NULL 78
AGENTE 1 NULL NULL 153
AGENTE 2 PS3 FRANCIA 16
AGENTE 2 PS3 GERMANIA 19
AGENTE 2 PS3 ITALIA 22
AGENTE 2 PS3 SPAGNA 32
AGENTE 2 PS3 NULL 89
AGENTE 2 WII GERMANIA 33
AGENTE 2 WII INGHILTERRA 7
AGENTE 2 WII ITALIA 23
AGENTE 2 WII SPAGNA 14
AGENTE 2 WII NULL 77
AGENTE 2 NULL NULL 166
NULL NULL NULL 319
Quindi, per ogni AGENTE:
AGENTE 1 NULL NULL 153
AGENTE 2 NULL NULL 166
Per ogni raggruppamento AGENTE/PRODOTTO:
AGENTE 1 PS3 NULL 75
AGENTE 1 WII NULL 78
AGENTE 2 PS3 NULL 89
AGENTE 2 WII NULL 77
E infine è presente anche il totale dei totali:
NULL NULL NULL 319
Leave a Reply