Definizione e calcolo delle misure - DBGroup
Definizione e calcolo delle misure - DBGroup
Definizione e calcolo delle misure - DBGroup
You also want an ePaper? Increase the reach of your titles
YUMPU automatically turns print PDFs into web optimized ePapers that Google loves.
<strong>Definizione</strong> e <strong>calcolo</strong> <strong>delle</strong> <strong>misure</strong><br />
! Misure Derivate<br />
! Misure Calcolate<br />
! Misure Derivate e Progetto Logico<br />
! Calcolo <strong>delle</strong> Misure<br />
! Aggregabilità<br />
Misure Derivate<br />
" Sono <strong>misure</strong> definite a partire da altre <strong>misure</strong> dello schema<br />
di fatto applicando operatori matematici :<br />
# Nellesempio <strong>delle</strong> vendite incasso è una misura derivata :<br />
incasso = prezzo_unitario * quantità_venduta<br />
" Una misura derivata viene calcolata sugli eventi primari,<br />
ovvero prima di effettuare l’aggregazione; quindi, al pari<br />
<strong>delle</strong> altre <strong>misure</strong> (normali o esplicite), anche per le <strong>misure</strong><br />
derivate si deve definire un operatore di aggregazione<br />
# La misura derivata incasso è additiva, in quanto<br />
- lincasso annuale è la somma degli incassi mensili<br />
- lincasso di una categoria di prodotto è la somma degli<br />
incassi dei relativi tipi<br />
- lincasso dei negozi in uno stato è la somma degli incassi dei<br />
negozi <strong>delle</strong> regioni di quello stato<br />
# Si noti quindi che la misura derivata incasso è additiva anche<br />
se una sua componente (prezzo_unitario) non è additiva<br />
2
Misure Derivate : Esempio<br />
" Schema di Fatto ESAMI<br />
# Dimensioni<br />
• STUD (con in gerarchia FACOLTA) e DATA (con in gerarchia MESE)<br />
# Misure<br />
• BASE (Crediti di tipo Base) e ALTRO (Crediti di tipo ALTRO)<br />
# Misure derivate<br />
• RAPPORTO = BASE/ALTRO<br />
• TOTALE = BASE + ALTRO<br />
STUD DATA BASE ALTRO RAPPORTO TOTALE<br />
ING1 GEN1 20 2 10 22<br />
ING1 GEN2 40 4 10 44<br />
ING2 GEN2 30 6 5 36<br />
SUM SUM AVG SUM<br />
F AC O L T A DA T A BA S E A L TR O RA P P O RT O T O T A L E<br />
I N G G EN 1 20 2 10 22<br />
I N G G EN 2 70 10 7, 5 80<br />
FACOLTA MESE BASE ALTRO RAPPORTO TOTALE<br />
ING GEN 90 12 8,33 102<br />
3<br />
Misure Calcolate<br />
" Una misura calcolata è una misura il cui valore è calcolato a<br />
partire da altre <strong>misure</strong> dopo aver aggregato i dati, ovvero il<br />
valore è valutato sugli eventi secondari :<br />
! non si definisce un operatore di aggregazione!<br />
" Esempio: schema di Fatto ESAMI<br />
# Misura derivata : TOT_DER = BASE + ALTRO (SUM)<br />
# Misura calcolata : TOT_CALC= BASE + ALTRO<br />
STUD DATA BASE ALTRO TOT_DER TOT_CAL<br />
ING1 GEN1 20 2 22 C 22<br />
ING1 GEN2 40 4 44 44<br />
ING2 GEN2 30 6 36 36<br />
SUM<br />
SUM<br />
SUM<br />
FACOLTA DATA BASE ALTRO TOT_DER TOT_CALC<br />
ING GEN1 20 2 22 22<br />
ING GEN2 70 10 80 80<br />
FACOLTA MESE BASE ALTRO TOT_DER TOT_CALC<br />
ING GEN 90 12 102 102<br />
4
Misure Calcolate vs Derivate<br />
" Per una misura derivata non è sempre equivalente calcolare il<br />
valore aggregato a partire dal valore aggregato <strong>delle</strong> <strong>misure</strong><br />
componenti:<br />
$ non è sempre equivalente definire una misura derivata<br />
come misura calcolata!<br />
" Esempio: schema di Fatto ESAMI<br />
# Misura derivata : RAP_DER = BASE/ALTRO (AVG)<br />
# Misura calcolata : RAP_CALC = BASE/ALTRO<br />
STUD DATA BASE ALTRO RAP_DER RAP_CALC<br />
ING1 GEN1 20 2 10 10<br />
ING1 GEN2 40 4 10 10<br />
ING2 GEN2 30 6 5 5<br />
SUM SUM AVG<br />
FACOLTA DATA BASE ALTRO RAP_DER RAP_CALC<br />
ING GEN1 20 2 10 10<br />
ING GEN2 70 10 7,5 7<br />
FACOLTA MESE BASE ALTRO RAP_DER RAP_CALC<br />
ING GEN 90 12 8,33 7,5<br />
5<br />
Misure Calcolate vs Derivate: Esempio<br />
" Il progettista deve scegliere se usare una misura derivata oppure<br />
calcolata<br />
" Esempio: misura INCASSO nello schema di fatto VENDITA<br />
Sum AVG<br />
Sum<br />
Tipo Quantit Prezzo<br />
T1 12 1,25<br />
T2 9 0,80<br />
22,70<br />
Incasso_calcolato<br />
15,00<br />
7,20<br />
22,20<br />
" INCASSO deve essere una misura derivata: non è possibile calcolare<br />
il valore aggregato della misura derivata Incasso a partire dal valore<br />
aggregato <strong>delle</strong> <strong>misure</strong> componenti!<br />
# lincasso annuale non può essere calcolato moltiplicando la<br />
quantità venduta in un anno per il prezzo unitario medio annuale.<br />
6
Misure Calcolate vs Derivate<br />
" Se la misura derivata e le sue componenti sono distributive<br />
è possibile calcolare il valore aggregato a partire dal valore<br />
aggregato <strong>delle</strong> <strong>misure</strong> componenti e quindi si ottiene lo<br />
stesso risultato definendo la misura come calcolata.<br />
" Verifica negli esempi precedenti:<br />
1. Misura additiva TOTALE, con componenti additive:<br />
il valore aggregato si può calcolare a partire dal valore<br />
aggregato <strong>delle</strong> componenti<br />
2. Misura additiva INCASSO, con una componente additiva e<br />
laltra no: il valore aggregato non si può calcolare a partire<br />
dal valore aggregato <strong>delle</strong> componenti<br />
3. Misura non-additiva RAPPORTO , con componenti additive:<br />
il valore aggregato non si può calcolare a partire dal valore<br />
aggregato <strong>delle</strong> componenti<br />
" La scelta si basa sull’efficienza del <strong>calcolo</strong>:<br />
intuitivamente una misura calcolata è più efficiente” in<br />
quanto il <strong>calcolo</strong> avviene sui dati aggregati<br />
7<br />
Misure Derivate generalizzate<br />
" Nel caso generale, una misura derivata si può definire a<br />
partire da altre <strong>misure</strong> dello schema di fatto applicando oltre<br />
che operatori matematici anche operatori logici<br />
" Esempio: Misura additiva NumVenditePromo per il<br />
conteggio <strong>delle</strong> vendite effettuate in promozione, calcolata<br />
sulla base di una misura Sconto<br />
NUMVENDITEPROMO =<br />
CASE WHEN SCONTO=0 THEN 0 ELSE 1 END<br />
" Esempio: Misura additiva NumVoliInRitardo per il conteggio<br />
dei voli in ritardo, calcolata sulla base di una misura Ritardo<br />
NUMVOLIINRITARDO=<br />
CASE WHEN RITARDO > 5 THEN 1 ELSE 0 END<br />
8
Misure Calcolate generalizzate<br />
" Nel caso generale, una misura calcolata è una misura il cui<br />
valore è calcolato dopo aver aggregato i dati, a partire da altre<br />
<strong>misure</strong> e/o usando i valori degli attributi dimensionali<br />
" Esempi (l’esempio completo è a pagina ???):<br />
Misura calcolata per il conteggio degli eventi primari di VENDITA:<br />
NUM_VENDITE = count(*)<br />
Misura calcolata per il conteggio degli scontrini in VENDITA:<br />
NUM_CLIENTI = COUNT (DISTINCT NUM.SCONTRINO)<br />
TIPO<br />
DATA<br />
VENDITA<br />
Una misura calcolata può<br />
essere indicata nello schema<br />
di fatto con (C)<br />
PRODOTTO<br />
QUANTITA<br />
(C) NUM_VENDITE<br />
(C) NUM_CLIENTI<br />
NUM.<br />
SCONTRINO<br />
9<br />
Misure Derivate e progetto logico<br />
" Per definizione, una misura derivata non dovrebbe essere<br />
inserita nella fact table, in quanto derivabile appunto dai<br />
valori <strong>delle</strong> altre <strong>misure</strong> e pertanto il <strong>calcolo</strong> può essere<br />
demandato al sistema OLAP<br />
" Una misura derivata può essere inserita nella fact table, e<br />
calcolata quindi in fase di alimentazione per<br />
1. Motivi di efficienza<br />
2. Assenza nel sistema OLAP degli operatori che<br />
definiscono la misura derivata. Ad esempio, in Analysis<br />
Services è conveniente definire le <strong>misure</strong> derivate con<br />
operatori logici in fase di alimentazione e quindi inserirle<br />
nella fact table.<br />
10
Calcolo <strong>delle</strong> <strong>misure</strong>:<br />
Progetto Fisico e Viste<br />
" Un significativo aumento <strong>delle</strong> prestazioni può essere ottenuto<br />
precalcolando i dati aggregati di uso più comune<br />
" Misure definite con operatori Distributivi ed Algebrici<br />
permettono di calcolare dati aggregati a partire direttamente<br />
da dati parzialmente aggregati<br />
" Lottimizzazione usa il concetto di vista materializzata:<br />
# Ogni pattern secondario corrisponde ad una vista sul pattern primario<br />
# Vengono materializzate le viste (ovvero pre-calcolate e memorizzate<br />
in tabelle o altre strutture dati) corrispondenti ad alcuni pattern<br />
secondari, ovvero a quelli maggiormente utilizzati (carico di lavoro)<br />
# La scelta <strong>delle</strong> viste da materializzare è basata sul compromesso tra<br />
diversi vincoli, i principali dei quali sono<br />
• Tempo di costruzione ed aggiornamento <strong>delle</strong> viste materializzate,<br />
ovvero tempo di <strong>calcolo</strong> al momento del caricamento/refresh del DW<br />
• Spazio aggiuntivo richiesto<br />
11<br />
Le viste<br />
" Le viste possono essere identificate in base al livello (pattern) di<br />
aggregazione che le caratterizza<br />
v 1 = {prodotto, data, negozio}!<br />
v 2 = {tipo, data, città}!<br />
v 4 = {tipo, mese, regione}!<br />
v 3 = {categoria, mese,<br />
città}!<br />
v 5 = {trimestre, regione}!<br />
" Viste primarie: corrispondono al pattern di aggregazione<br />
primario (non aggregato)<br />
" Viste secondarie: corrispondono ai pattern di aggregazione<br />
secondari (aggregati)
Risolvibilità <strong>delle</strong> interrogazioni<br />
" Una vista v sul pattern p non serve solo per le interrogazioni con<br />
pattern di aggregazione p ma anche per tutte quelle che richiedono i<br />
dati a pattern p' più aggregati di p (p ! p')<br />
{a,b}<br />
b'<br />
a'<br />
b<br />
a<br />
{a',b}<br />
{a,b'}<br />
{b}<br />
{a',b'}<br />
{a}<br />
{b'}<br />
{a'}<br />
{ }<br />
Reticolo di roll-up<br />
Scelta <strong>delle</strong> viste materializzate<br />
" È utile materializzare una vista quando:<br />
# Risolve direttamente una interrogazione frequente<br />
# Permette di ridurre il costo di esecuzione di molte interrogazioni<br />
" Non è consigliabile materializzare una vista quando:<br />
# Il suo pattern di aggregazione è molto simile a quello di<br />
una vista già materializzata<br />
# Il suo pattern di aggregazione è molto fine<br />
# La materializzazione non riduce di almeno un ordine di<br />
grandezza il costo <strong>delle</strong> interrogazioni<br />
% Tecniche di scelta <strong>delle</strong> viste da materializzare sono<br />
generalmente già implementate nei sistemi OLAP e<br />
allutente viene solo chiesto di configurare alcuni<br />
parametri, quali lo spazio a disposizione per la<br />
memorizzazione <strong>delle</strong> viste da materializzare
Analysis Services: archiviazione cubo<br />
" In Analysis Services e possibile precalcolare tutte le possibili<br />
aggregazioni<br />
# Nel cubo Sales di FoodMart ci sono 1036 aggregazioni:<br />
Analysis Services: archiviazione cubo<br />
" Oppure si fissa un limite allo spazio di archiviazione stimato<br />
# Nel cubo Sales di FoodMart fissando 100MB si ottengono 398<br />
aggregazioni:
Analysis Services: operatore AVG<br />
" AVG è un operatore di aggregazione algebrico che ha come<br />
misura di supporto COUNT<br />
" Nel sistema OLAP Analysis Services: AVG non è disponibile<br />
come operatore ma deve essere calcolato<br />
tramite SUM e COUNT<br />
" Esempio : prezzo_unitario (PU) aggregato tramite AVG<br />
1. Si definisce PUBase aggregando PU con SUM;<br />
2. Si definisce la misura di supporto Conteggio, aggregata con COUNT<br />
3. Si definisce PU come misura calcolata PUBase/Conteggio<br />
17
Alimentazione: <strong>calcolo</strong> <strong>delle</strong> <strong>misure</strong><br />
! L’alimentazione definisce le istanze di un Data Mart a partire<br />
dalle istanze del DataBase operazionale DBO<br />
! Nel progetto dell’alimentazione si definisce il <strong>calcolo</strong> effettivo<br />
<strong>delle</strong> <strong>misure</strong> (normali o esplicite) di uno Schema di Fatto e le<br />
istanze che costituiranno le dimensioni<br />
! Nel seguito tratteremo il <strong>calcolo</strong> <strong>delle</strong> <strong>misure</strong> e l’analisi della<br />
loro aggregabilità rispetto alle dimensioni<br />
! Dato uno Schema di Fatto F,<br />
con dimensioni D = {D1, !, Dn } e <strong>misure</strong> M = {M1, !, Mk};<br />
per ogni misura Mi si deve definire una view F_Mi sul DBO, con<br />
schema F_Mi(D1,!,Dn,Mi)<br />
! Il join naturale di tutte le view F_Mi risulta nella vista F, che<br />
chiameremo vista degli Eventi Primari, con schema :<br />
F(D1,!,Dn,M1, !, Mk)<br />
18<br />
Alimentazione: <strong>calcolo</strong> <strong>delle</strong> <strong>misure</strong><br />
! Dal punto di vista operativo, salvo casi in cui una o più <strong>misure</strong><br />
richiede un <strong>calcolo</strong> particolare, è possibile definire direttamente<br />
solo la vista degli Eventi Primari F sul DBO : nel seguito<br />
considereremo questo caso, calcolando la view F<br />
! Spesso, nei casi reali, per semplificare la definizione di F,<br />
occorre definire prima altre view.<br />
! La struttura della view F dipende dal tipo di schema:<br />
1. Negli schemi temporali è una query con<br />
raggruppamento sulle dimensioni, mentre negli schemi<br />
transazionali è una query senza raggruppamento<br />
! La vista degli Eventi Primari verrà anche chiamata<br />
FACT_TABLE, in quanto definisce appunto le istanze della<br />
FACT_TABLE nella schema logico relazionale del Data Mart<br />
19
Esempio: DBO (schema E/R e logico)<br />
TIPO<br />
quantità<br />
COD<br />
prezzo<br />
unitario<br />
data<br />
Identificatori Fatto Vendita:<br />
I1 = {PRODOTTO,NUM.SCONTRINO}<br />
PRODOTTO<br />
(0,N) (1,1)<br />
in<br />
VENDITA<br />
(1,1)<br />
(1,N)<br />
in SCONTRINO<br />
I2 = {COD}<br />
prodotto<br />
num. scontrino<br />
PRODOTTO<br />
PRODOTTO<br />
ALIM_1<br />
ALIM_2<br />
TIPO<br />
Alimentare<br />
Alimentare<br />
SCONTRINO<br />
NUMERO DATA<br />
Scontr12 02/02/02<br />
Scontr13 02/02/02<br />
VENDITA<br />
COD PRODOTTO N_SCONTRINO QUANTITA PREZZO_UNITARIO<br />
3 ALIM_1 Scontr12 12 25<br />
2 ALIM_2 Scontr12 13 12<br />
1 ALIM_2 Scontr13 24 13<br />
20<br />
Esempio: progettazione concettuale<br />
tipo<br />
prodotto<br />
quantità<br />
prezzo-unitario<br />
prodotto +<br />
num.scontrino<br />
data<br />
num.scontrino<br />
! Dimensioni =<br />
{ prodotto, num.scontrino }<br />
! Tipologia dello Schema: transazionale (le dimensioni coincidono con I1)<br />
! <strong>Definizione</strong> <strong>delle</strong> <strong>misure</strong>: di ogni misura si deve<br />
1. Definire la tipologia: esplicita/derivata/calcolata<br />
2. Per le <strong>misure</strong> esplicite<br />
1. (alimentazione) definire il suo <strong>calcolo</strong> a partire dal DBO<br />
2. (aggregabilità) definire l’operatore di aggregazione degli eventi<br />
3. Per le <strong>misure</strong> derivate<br />
1. definire il suo <strong>calcolo</strong> per ogni evento primario<br />
2. (aggregabilità) definire l’operatore di aggregazione<br />
4. Per le <strong>misure</strong> calcolate<br />
1. definire il suo <strong>calcolo</strong> per ogni evento, primario e secondario<br />
21
Esempio: <strong>Definizione</strong> <strong>delle</strong> <strong>misure</strong><br />
! Misura QUANTITA : è una misura esplicita; essendo lo schema<br />
transazionale coincide con il valore dell’attributo quantità del DBO.<br />
Operatore di aggregazione degli eventi: SUM<br />
! Misura NUM_CLIENTI: è una misura calcolata definita come<br />
COUNT(DISTINCT NUM.SCONTRINO)<br />
! Misura NUM_VENDITE: è una misura calcolata definita come<br />
COUNT(*)<br />
TIPO<br />
VENDITA<br />
DATA<br />
Una misura calcolata verrà<br />
indicata nello schema di fatto<br />
con (C)<br />
PRODOTTO<br />
QUANTITA<br />
(C) NUM_VENDITE<br />
(C) NUM_CLIENTI<br />
NUM.<br />
SCONTRINO<br />
22<br />
Esempio: Alimentazione<br />
! Schema transazionale :<br />
vista degli Eventi Primari senza alcun raggruppamento:<br />
create view EP_VENDITA as <br />
"select "PRODOTTO, <br />
" " "NUM.SCONTRINO, <br />
" " "QUANTITA <br />
"from " "DBO.VENDITA"<br />
! Se si considera solo l’identificatore I2 : le dimensioni non contengono<br />
alcun identificatore e quindi viene assunto erroneamente lo schema<br />
come temporale: vista degli Eventi Primari con raggruppamento "<br />
select "PRODOTTO, NUM.SCONTRINO, <br />
" "SUM(QUANTITA) AS QUANTITA <br />
from " "DBO.VENDITA <br />
group by "PRODOTTO,NUM.SCONTRINO"<br />
" Il <strong>calcolo</strong> risulta corretto, però si effettua un raggruppamento,<br />
un <strong>calcolo</strong> di funzione aggregata inutile.<br />
" Si devono considerare tutti gli identificatori!<br />
23
Esempio B : Vendita con schema temporale<br />
COD<br />
TIPO<br />
quantità<br />
prezzo<br />
unitario<br />
data<br />
Identificatori Fatto Vendita:<br />
I1 = {PRODOTTO,NUM.SCONTRINO}<br />
PRODOTTO<br />
(0,N) (1,1)<br />
in<br />
VENDITA<br />
(1,1)<br />
(1,N)<br />
in SCONTRINO<br />
I2 = {COD}<br />
prodotto<br />
num. scontrino<br />
tipo<br />
quantità<br />
prezzo-unitario<br />
data<br />
prodotto<br />
prodotto +<br />
num.scontrino<br />
num.scontrino<br />
! Dimensioni = { prodotto, data}<br />
! Tipologia dello Schema: temporale (le dimensioni non contengono<br />
nessuno dei due identificatori)<br />
24<br />
Esempio B: <strong>Definizione</strong> <strong>delle</strong> <strong>misure</strong><br />
! Misura QUANTITA : è una misura esplicita;<br />
essendo lo schema temporale si deve definire tramite un opportuno<br />
operatore di aggregazione dei dati del DBO:<br />
QUANTITA = SUM (quantità)<br />
Operatore di aggregazione degli eventi : SUM<br />
! Misura NUM_CLIENTI: il significato è ancora quello di conteggio<br />
distinto degli scontrini, però adesso num.scontrino non sarà più<br />
disponibile nello schema di fatto. Allora si considera come misura<br />
esplicita e definita sui dati del DBO come:<br />
NUM_CLIENTI= COUNT(DISTINCT num.scontrino)<br />
Operatore di aggregazione degli eventi : SUM<br />
! Misura NUM_VENDITE: il significato è ancora quello di conteggio <strong>delle</strong><br />
vendite, però adesso lo schema è temporale quindi si considera come<br />
misura esplicita e definita sui dati del DBO come:<br />
NUM_VENDITE= COUNT(*)<br />
Operatore di aggregazione degli eventi : SUM<br />
25
Esempio B : alimentazione<br />
! Schema temporale :<br />
vista degli Eventi Primari con raggruppamento<br />
create view EP_VENDITA as <br />
"select "PRODOTTO, <br />
" "DATA, <br />
" "SUM(QUANTITA) AS QUANTITA, <br />
" "COUNT(DISTINCT NUM.SCONTRINO) AS NUM_CLIENTI, <br />
" "COUNT(*) AS NUM_VENDITE <br />
"from "DBO.VENDITA V join DBO.SCONTRINO S <br />
" " "on V.NS = S.NS"<br />
"group by PRODOTTO, DATA <br />
""<br />
! La vista di alimentazione VENDITA deve essere ovviamente definita<br />
considerando lo schema logico del DBO. Nell’esempio abbiamo<br />
supposto che<br />
"<br />
<br />
VENDITA(NS:SCONTRINO, PRODOTTO:PRODOTTO, COD,<br />
" "QUANTITA,PREZZO_UNITARIO) " ""<br />
SCONTRINO(NS,DATA)" ""<br />
PRODOTTO(PRODOTTO,TIPO) " ""<br />
26<br />
Aggregabilità <strong>delle</strong> <strong>misure</strong><br />
! Dopo aver definito il <strong>calcolo</strong> effettivo di una misura a partire dalle<br />
istanze del DBO, è possibile valutare la sua aggregabilità<br />
! Informalmente, una misura è aggregabile su una dimensione se i<br />
suoi valori possono essere aggregati rispetto a tale dimensione<br />
! Per valutare l’aggregabilità rispetto ad una dimensione Di, si<br />
considera il pattern ottenuto da quello primario eliminando Di<br />
! Si può valutare l’aggregabilità considerando alcune istanze d’esempio<br />
oppure fare <strong>delle</strong> interrogazioni e confrontare il risultato<br />
27
Esempio B : Aggregabilità <strong>delle</strong> <strong>misure</strong><br />
! Aggregabilità rispetto a PRODOTTO: deve essere valutata<br />
considerando il raggruppamento rispetto a PRODOTTO<br />
! Raggruppamento rispetto a PRODOTTO calcolato sul DBO<br />
select "PRODOTTO, "DATA, <br />
" "SUM(QUANTITA) AS QUANTITA, <br />
" "COUNT(DISTINCT NUM.SCONTRINO) AS NUM_CLIENTI, <br />
" "COUNT(*) AS NUM_VENDITE <br />
"from "DBO.VENDITA <br />
"group by PRODOTTO, DATA"<br />
! Le <strong>misure</strong> sono aggregabili rispetto a PRODOTTO se si ottiene lo<br />
stesso risultato raggruppando gli Eventi Primari rispetto a PRODOTTO:<br />
select "DATA, <br />
" "SUM(QUANTITA) AS QUANTITA, <br />
" "SUM(NUM_CLIENTI) AS NUM_CLIENTI, <br />
" "SUM(NUM_NUMVENDITE) AS NUM_VENDITE <br />
"from "EP_VENDITA <br />
"group by DATA"<br />
28<br />
Esempio B : Aggregabilità <strong>delle</strong> <strong>misure</strong><br />
! Aggregabilità rispetto a DATA: deve essere valutata considerando il<br />
raggruppamento rispetto a DATA<br />
! Raggruppamento rispetto a DATA calcolato sul DBO<br />
select "PRODOTTO, "DATA, <br />
" "SUM(QUANTITA) AS QUANTITA, <br />
" "COUNT(DISTINCT NUM.SCONTRINO) AS NUM_CLIENTI, <br />
" "COUNT(*) AS NUM_VENDITE <br />
"from "DBO.VENDITA <br />
"group by PRODOTTO, DATA"<br />
! Le <strong>misure</strong> sono aggregabili rispetto a DATA se si ottiene lo stesso<br />
risultato raggruppando gli Eventi Primari rispetto a DATA:<br />
select "PRODOTTO, <br />
" "SUM(QUANTITA) AS QUANTITA, <br />
" "SUM(NUM_CLIENTI) AS NUM_CLIENTI, <br />
" "SUM(NUM_NUMVENDITE) AS NUM_VENDITE <br />
"from "EP_VENDITA <br />
"group by PRODOTTO"<br />
29
Esempio B : Aggregabilità <strong>delle</strong> <strong>misure</strong><br />
! Consideriamo le seguenti istanze del DBO e la relativa EP_VENDITA<br />
EP_VENDITA<br />
SCONTRINO<br />
PRODOTTO<br />
VENDITA<br />
30<br />
Esempio B : Aggregabilità <strong>delle</strong> <strong>misure</strong><br />
! Confronto raggruppamento rispetto a PRODOTTO<br />
! Confronto raggruppamento rispetto a DATA<br />
31
Esempio B : schema di fatto<br />
! Dall’analisi precedente risulta che :<br />
# QUANTITA e NUM_VENDITE sono aggregabili rispetto a tutte le<br />
dimensioni<br />
# NUM_CLIENTI è aggregabile rispetto a DATA ma non rispetto a<br />
PRODOTTO<br />
PRODOTTO<br />
TIPO<br />
VENDITA<br />
QUANTITA<br />
NUM_VENDITE<br />
NUM_CLIENTI<br />
DATA<br />
32<br />
Esempio B : Pattern in OLAP<br />
! Query SQL-OLAP per visualizzare il pattern {DATA,PRODOTTO} ed i<br />
suoi sub-pattern {DATA}, {PRODOTTO} e {} :<br />
i pattern per i quali NUM_CLIENTI non è aggregabile non vengono<br />
mostrati<br />
select DATA, PRODOTTO,<br />
SUM(QUANTITA) AS QUANTITA,<br />
SUM(NUM_CLIENTI) AS NUM_CLIENTI,<br />
SUM(NUM_VENDITE) AS NUM_VENDITE<br />
from EP_VENDITA<br />
group by DATA, PRODOTTO WITH CUBE<br />
having GROUPING(PRODOTTO) 1<br />
33
Esempio B : pattern in OLAP<br />
! Query SQL-OLAP per visualizzare il pattern {DATA,PRODOTTO} ed i<br />
suoi sub-pattern {DATA}, {PRODOTTO} e {} : i pattern per i quali<br />
NUM_CLIENTI non è aggregabile vengono segnalati con (NA)<br />
select DATA, PRODOTTO,<br />
SUM(QUANTITA) AS QUANTITA,<br />
NUM_CLIENTI = CASE<br />
WHEN GROUPING(PRODOTTO)=1 THEN<br />
CAST(SUM(NUM_CLIENTI) AS VARCHAR) + ' (NA)'<br />
ELSE CAST(SUM(NUM_CLIENTI) AS VARCHAR)<br />
END,<br />
SUM(NUM_CLIENTI) AS NUM_CLIENTI,<br />
SUM(NUM_VENDITE) AS NUM_VENDITE<br />
from EP_VENDITA<br />
group by DATA, PRODOTTO WITH CUBE<br />
34