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

Your email address will not be published.

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>