Raggruppamento in SQL Esempio di raggruppamento È possibile dare un nome alle colonne tramite AS
Raggruppamento in SQL Un altro esempio
Raggruppamento in SQL Le funzioni aggregate non si possono innestare Nell’esempio non possiamo calcolare la media dei totali, perchè non possiamo scrivere avg(sum(QUANTITA))
Raggruppamento in SQL Le funzioni aggregate non si possono innestare: si può fare il calcolo in più passi usando le viste Nell’esempio
Raggruppamento in SQL Il GROUP BY riporta solo le combinazioni presenti Come ottenere anche che la combinazione (MI,GEN1) con TOQUANTITA’ pari a zero?
Raggruppamento in SQL Opzione ALL nella clausola GROUP BY : GROUP BY ALL In questo modo ottengo tutte le possibili combinazioni, quindi anche (MI,GEN1), ma con TOQUANTITA’ pari a NULL in quanto una funzione aggregata applicata ad un insieme vuoto restituisce NULL. Come ottenere ZERO invece di NULL?
Raggruppamento in SQL Funzione ISNULL: ISNULL(COLONNA,VALORECOSTANTE) se il valore di COLONNA è NULL riporta il valore specificato in VALORECOSTANTE, altrimenti riporta il normale valore di COLONNA
I nuovi operatori CUBE e ROLLUP Riconsideriamo l’esempio (nel seguito useremo GROUP BY senza ALL): E’ possibile ottenere nella stessa query la quantità totale per ciascuna CITTÀ (SETTIMANA)? Occorre raggruppare il risultato della query su CITTA (SETTIMANA) ...
Il nuovo operatore CUBE SELECT ... <come prima> group by CITTA, SETTIMANA with cube Usando l’operatore CUBE nel GROUP BY GROUP BY ... WITH CUBE si includono nuove righe che raggruppano le righe ottenute dal GROUP BY semplice Si usa un nuovo valore polimorfo ALL per rappresentare che il raggruppamento è relativo a tutti i valori della colonna
L’operatore CUBE in SQL-SERVER SQL-Server ha l’operatore CUBE, però non ha il valore ALL: lo rappresenta con “NULL”
Funzione aggregata GROUPING Si può usare solo quando la GROUP BY contiene cube (o rollup) assume il valore 1 se il valore della colonna è NULL e la tupla è generata dall’operatore cube (o rollup): GROUPING(CITTA)=1 se e sole se CITTA=ALL
L’operatore CUBE in SQL-SERVER Utilizzando la funzione GROUPING con il CASE si riesce ad ottenere il risultato voluto
L’operatore CUBE in SQL-SERVER Un altro esempio più semplice
Roll-up Su dati multidimensionali, una operazione di Roll-up aggrega i dati eliminando un livello da una gerarchia Cosa succede se l’operatore CUBE è utilizzato in una aggregazione rispetto ai livelli di una gerarchia? Esempio rispetto a MESE e SETTIMANA: Queste righe non hanno senso, in quanto SETTIMANA --> MESE e quindi ad una settimana corrisponde sempre un solo mese!
L’operatore ROLLUP in SQL-SERVER Con GROUP BY COL1,COL2, ... COLn WITH ROLLUP si includono nuove righe che raggruppano le righe del GROUP BY semplice ma per la COLi non si riportano le righe ottenute raggruppando i valori delle colonne sulla sinistra
L’operatore ROLLUP in SQL-SERVER Altro esempio con ROLLUP (applicato ad una sequenza generica, non ad una gerarchia di dimensioni)