SQL/OLAP Estensioni OLAP in SQL 1
Definizione e calcolo delle misure Definire una misura significa specificare gli operatori di aggregazione rispetto a tutte le dimensioni del fatto Ipotesi: per ogni misura, è definito un unico operatore di aggregazione valido per ogni dimensione Misura M di F con operatore di aggregazione OP valido per ogni dimensione: il valore di M per un pattern secondario P è definito aggregando gli eventi primari di F sul P ed applicando OP. In termini relazionali (linguaggio SQL): select P, OP(M) " " " " " "from F " " " " " "group by P!! Ovviamente questa operazione non deve essere esplicitata dall utente/progettista ma viene formulata dal sistema OLAP. Tuttavia tale espressione SQL può risultare utile in caso di dubbio, per verificare quello ottenuto tramite il sistema OLAP 2
Estensioni OLAP in SQL SQL99 è stato il primo standard SQL ad offrire soluzioni per l analisi dei dati: questa parte dello standard viene chiamata SQL/OLAP I principali operatori di SQL/OLAP sono: CUBE e ROLLUP SQL SERVER offre varie estensione alla clausola SELECT per l analisi dei dati: alcune di queste estensioni sono definite secondo lo standard SQL/ OLAP, altre sono proprie di SQL SERVER Nel seguito vengono introdotti gli operatori CUBE e ROLLUP di SQL/OLAP (considerando la loro implementazione in SQL SERVER). 3
Perché si usa l OLAP in SQL L obiettivo è duplice: 1. Effettuare alcune analisi direttamente in SQL, cioè senza usare un sistema OLAP 2. Avere uno strumento per verificare i risultati del sistema OLAP 1. Individuazione di errori dovuti all alimentazione del cubo del sistema OLAP 2. Verifica del risultato ottenuto con particolari operatori del sistema OLAP 4
Definizione e calcolo delle misure Fatto VENDITA RAPPRESENTANTE MESE FORNITORE CITTA NEGOZIO SETTIMANA VENDITA QUANTITA GUADAGNO CATEGORIA PRODOTTO Misura QUANTITA con operatore di aggregazione SUM Per eseguire : select P, SUM(QUANTITA) " " " "from VENDITA " " " "group by P!! per un qualsiasi pattern P (del reticolo di roll-up), la relazione VENDITA della FROM deve contenere tutti gli attributi dimensionali del fatto VENDITA e la misura QUANTITA. 5
Definizione e calcolo delle misure Si considera lo schema logico (star-schema) del fatto e si definisce VENDITA come una vista con tutte gli attributi dimensionali e le misure: 6
Definizione e calcolo delle misure Misura QUANTITA aggregata tramite SUM pattern { CITTA,SETTIMANA } pattern vuoto 7
Estensioni OLAP in SQL Riconsideriamo il pattern { CITTA,SETTIMANA } Come ottenere nella stessa query la quantità totale per ciascuna CITTÀ (oppure per ciascuna SETTIMANA) oppure la quantità per tutte le vendite? Occorre raggruppare il risultato della query su CITTA (SETTIMANA)... 8
Il nuovo operatore CUBE Usando l operatore CUBE nel GROUP BY GROUP BY... WITH CUBE SELECT CITTA,SETTIMANA, SUM(QUANTITA) AS TOTQUANTITA FROM VENDITA group by CITTA, SETTIMANA 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 9
Il nuovo operatore CUBE La visualizzazione del pattern di aggregazione {A1, A2,, An } avviene tramite GROUP BY A1, A2,, An La visualizzazione del pattern di aggregazione {A1, A2,, An } e di tutti i suoi sub-pattern avviene tramite GROUP BY A1, A2,, An WITH CUBE Ovvero si ottiene la visualizzazione di 2 n pattern, costituiti dagli elementi dell insieme potenza di {A1, A2,, An } 10
L operatore CUBE in SQL-SERVER SQL-Server ha l operatore CUBE, però non ha il valore ALL: lo rappresenta con NULL È possibile codificare i NULL in modo da ottenere ALL oppure un valore specifico quale 'TutteLeCitta', 'TutteLeSettimane' funzione GROUPING 11
Funzione GROUPING Si può usare solo quando la GROUP BY contiene cube (o rollup) In una query che raggruppa su ATTRIBUTO, GROUPING(ATTRIBUTO) restituisce 1 per le tuple che sono generate dall operatore cube (o rollup) e che hanno NULL come valore di ATTRIBUTO. Quindi GROUPING(CITTA)=1 se e sole se CITTA=ALL 12
L operatore CUBE in SQL-SERVER Utilizzando la funzione GROUPING con il CASE si riesce ad ottenere il risultato con ALL come nello standard 13
L operatore CUBE in SQL-SERVER e si può anche differenziare il valore di ALL nel caso di CITTA e SETTIMANA: Con GROUPING la logica della query non cambia: per semplicità nel seguito non verrà utilizzata, visualizzando nel risultato NULL! 14
L operatore CUBE in SQL-SERVER: esempi Pattern {CITTA} e {} Pattern {CITTA,FORNITORE,MESE} e tutti i suoi 2 n -1 sub-pattern 15
Pattern non significativi Un pattern è non significativo se c è una dipendenza funzionale tra i suoi elementi Ad esempio SETTIMANA, MESE con SETTIMANA MESE Il raggruppamento su un pattern non significativo è equivalente al raggruppamento sul solo determinate (SETTIMANA) Raggruppando su SETTIMANA, MESE anche se i gruppi non cambiano rispetto al solo raggruppamento su SETTIMANA, riesco però a visualizzare anche il MESE Questo può essere utile per visualizzare il risultato di un roll-up 16
Roll-up Su dati multidimensionali, una operazione di roll-up aggrega i dati lungo i livelli di una gerarchia Per visualizzare un roll-up, ad esempio passare da SETTIMANA a MESE, si può raggruppare rispetto a SETTIMANA e MESE e utilizzare l operatore CUBE per vedere anche i dati aggregati su MESE, però Queste righe non hanno senso, in quanto SETTIMANA --> MESE e quindi ad una settimana corrisponde sempre un solo mese! L operatore CUBE consente di visualizzare un roll-up però introduce delle righe inutili. 17
L operatore ROLLUP in SQL-SERVER GROUP BY A1,A2,... An WITH ROLLUP si includono nuove righe che raggruppano le righe del GROUP BY semplice (come per il CUBE) ma per Ai non si riportano le righe ottenute raggruppando i valori delle colonne sulla sinistra, ovvero delle colonne Aj, con j < i GROUP BY A1,A2,... An-1, An WITH ROLLUP si ottiene la visualizzazione di n + 1 pattern: {A1, A2,, An-1,An } {A1, A2,, An-1 } {A1} {} Pattern {MESE,SETTIMANA} {MESE} {} 18
ROLLUP in SQL-SERVER: ESEMPI ROLLUP lungo la dimensione NEGOZIO L operatore ROLLUP può essere applicato ad una sequenza generica, non necessariamente ad una sequenza di attributi dimensionali di una gerarchia: il risultato è comunque poco significativo, se confrontato con l analogo ottenuto con CUBE 19
Misure Derivate Sono misure definite a partire da altre misure dello schema di fatto applicando operatori matematici e/o logici; per le misure derivate occorre definire l operatore di aggregazione Dato un fatto Fatto F con misure MA (aggregata con OP_MA) e MB (aggregata con OP_MB), la misura derivata DER = MA Oper MB, aggregata con OP_DER è definita in SQL/OLAP come select P, OP_DER(MA Oper MB) AS DER!from F!group by P![with cube with rollup]! 20
Misure Derivate : esempi Esempio : PREZZOMEDIO = GUADAGNO/QUANTITA, aggregato tramite AVG Il cast è necessario per poter fare la divisione tra reali. 21
Misure Derivate : esempi Per semplificare le interrogazioni, la misura derivata viene aggiunta considerando una nuova vista VENDITANEW Con VENDITANEW si può usare la misura derivata senza riscrivere ogni volta l espressione che la definisce 22
Misure Derivate : esempi L esempio precedente si può riscrivere come in questo caso sono state aggiunte alla query anche le altre misure 23
Misure Calcolate Misure calcolate sui dati aggregati; non si deve definire l operatore di aggregazione Dato un fatto Fatto F con misure MA (aggregata con OP_MA) e MB (aggregata con OP_MB), la misura calcolata CALC = MA Oper MB è definita in SQL/OLAP come select P, OP_MA(MA) Oper OP_MB(MB) AS CALC!from F!group by P![with cube with rollup]! 24
Misure Calcolate: ESEMPI Esempio : PREZZOMEDIO_CALC = GUADAGNO/QUANTITA PREZZOMEDIO_CALC è calcolata come rapporto tra il valore aggregato di GUADAGNO (cioè SUM(GUADAGNO)) ed il valore aggregato di QUANTITA (cioè SUM(QUANTITA)) 25
Questa query non è corretta Note tecniche sul GROUP BY La colonna 'VENDITA.GUADAGNO' non è valida nell'elenco di selezione perché non è inclusa né in una funzione di aggregazione né nella clausola GROUP BY. Questa query non è corretta In una espressione della select, quale quella che definisce PREZZOMEDIO_CALC, non si possono usare nomi di colonna definiti nella stessa select (quali 'GUADAGNOTOT e 'QUANTITATOT' ) 26