1 ESEMPIO DI PROVA PRATICA (PRIMA

Transcript

1 ESEMPIO DI PROVA PRATICA (PRIMA
ESEMPIO DI PROVA PRATICA (PRIMA PARTE RELATIVA ALLA COSTRUZIONE DEL CUBO) Sono dati Schema di Fatto ESAME CITTA
STATO
STUDENTE
SOST: numero esami sostenuti, additiva SOST_I: misura di impatto SOST_P: misura pesata VOTO_I: voto medio, misura di impatto calcolata come VOTO_SUM/ SOST, dove VOTO_SUM: somma dei voti, additiva. CORSO
ESAME
(C) VOTO (AVG)
SOST_P
SOST_I
DOCENTE
FACOLTA
DM con push-­‐down Backup del DM: http://www.dbgroup.unimo.it/SIA/DM_LIBRI.bak 1 Viene richiesto di: 1) Realizzare il cubo con tutte le dimensioni e misure corrispondenti allo schema di Fatto ESAME 2) Ottenere la seguente visualizzazione dei dati: 3) Verificare i risultati ottenuti al punto 2) in SQL-­‐OLAP calcolando il seguente pattern con rollup: 2 SOLUZIONE Nella realizzazione del cubo, l’unico punto caratteristico è il fatto che la dimension table DT_CITTA deve essere usata due volte, una volta come città del docente ed un’altra come città dello studente Per quanto riguarda la definizione delle misure, ricordiamo che per la soluzione con Push-­‐down MISURA M PATTERN SENZA ATTRIBUTI gerarchia AM CON ATTRIBUTI gerarchia AM Valore Pesato M_P IMPATTO Valore non Pesato X X PESATA X X Valore Pesato M_P Quindi, per una misura pesata, quale SOST_P, si definisce semplicemente la misura con il relativo operatore di aggregazione: in questo caso SOST_P è additiva . Per una misura di impatto si deve invece definire una nuova misura (un membro calcolato) in grado di differenziare in modo da differenziare tra pattern con e senza attributi della gerarchia dell’AM: IF <PATTERN SENZA ATTRIBUTI GERARCHIA AM>
THEN <VALORE PESATO>
ELSE <VALORE NON PESATO>
Ricordiamo che anche in SQL-­‐OLAP si utilizzava WHEN <PATTERN SENZA ATTRIBUTI GERARCHIA AM>
THEN <VALORE PESATO>
ELSE <VALORE NON PESATO> END
3 Consideriamo per semplicità solo una parte del cubo, quella con dimensioni STUDENTE, DOCENTE e con misure SOST_P e SOST_I Ogni cella del cubo è individuata da un valore (membro secondo la terminologia AS) per ogni dimensione (sia le dimensioni classiche che la dimensione particolare Measures) : Ad esempio l’ultima cella in basso a destra (con visualizzato il valore 2) è individuata come segue: Dimensione STUDENTE: membro ITALIA (del livello STUDENTE.STATO_ STUDENTE) Dimensione DOCENTE : membro DA (del livello DOCENTE.DOCENTE) Dimensione Measures: membro SOST_I (del livello Measures. MeasuresLevel) mentre la prima cella in alto a destra (con visualizzato il valore 2,00) è individuata come segue: Dimensione STUDENTE: membro TUTTI STUDENTI (del livello (ALL) di STUDENTE) Dimensione DOCENTE : membro TUTTI DOCENTI (del livello (ALL) di DOCENTE) Dimensione Measures: membro SOST_I (del livello Measures. MeasuresLevel) Ogni membro ha una Key (per individuare il membro) e un Name (valore che viene visualizzato): nei nostri esempi – non usando chiavi surrogate -­‐ Key e Name coincidono. Per ogni cella del cubo la funzione DIMENSION.CURRENTMEMBER restituisce il membro di DIMENSION corrispondente alla cella. Ad esempio per l’ultima cella in basso a destra (con visualizzato il valore 2) abbiamo STUDENTE.CURRENTMEMBER = membro ITALIA DOCENTE.CURRENTMEMBER = membro DA Measures.CURRENTMEMBER = membro SOST_I 4 Consideriamo la dimensione DOCENTE : Se DOCENTE.CURRENTMEMBER è il membro DA (del livello DOCENTE.DOCENTE) Allora [DOCENTE].CurrentMember.name : è il nome del membro, ovvero cosa viene visualizzato [DOCENTE].CurrentMember.level: è il livello ; per un livello si può ottenere il nome e la posizione: [DOCENTE].CurrentMember.level.name = “DOCENTE” [DOCENTE].CurrentMember.level.ordinal =3 Quindi una cella del cubo corrispondente ad un <PATTERN SENZA ATTRIBUTI GERARCHIA AM>
È una cella corrispondente al membro “TUTTI DOCENTI” della dimensione relativa all’arco multiplo, ovvero della dimensione di cui è stato fatto il push-­‐down nella fact table, nel nostro caso la dimensione DOCENTE. In definitiva la condizione <PATTERN SENZA ATTRIBUTI GERARCHIA AM> corrisponde a controllare se il membro corrente di DOCENTE sia il membro “TUTTI DOCENTI”, condizione che si può scrivere come segue
[DOCENTE].CurrentMember.level.ordinal=0 oppure in modo equivalente [DOCENTE].CurrentMember.level.name=”(All)” IMPORTANTE: al membro ALL si può cambiare il nome (nell’esempio “TUTTI DOCENTI”) ma non al livello (ALL) , il cui nome è usato nella condizione [DOCENTE].CurrentMember.level.name=”(All)”! In definitiva per la misura di impatto SOST_I si definisce una nuova misura (un membro calcolato) come segue 1) Con SOST_I si definisce una misura additiva (non visibile) à SOST_I1 2) Si definisce SOST_I come membro calcolato tramite la seguente espressione Iif([DOCENTE].CurrentMember.level.name=”(All)”, [Measures].[Sost_P], [Measures].[Sost_I1]) 5 Analogo discorso per la misura di impatto VOTO_I (si mostra la relativa espressione nell’editor del membro calcolato) Per riepilogare, con [DOCENTE].CurrentMember.level.name=”(All)” Si ottiene un pattern senza attributi della gerarchia dell’arco multiplo (cioè senza DOCENTE, CITTA_DOCENTE, e STATO_DOCENTE), condizione che viene usata per calcolare il valore di impatto secondo lo schema MISURA M PATTERN SENZA ATTRIBUTI gerarchia AM CON ATTRIBUTI gerarchia AM Valore Pesato M_P IMPATTO Valore non Pesato X X PESATA X X Valore Pesato M_P 6 3) Verificare i risultati ottenuti al punto 2) in SQL-­‐OLAP calcolando il seguente pattern con rollup: Ricordiamo che in SQL-­‐OLAP per una misura di impatto si deve usare la struttura WHEN <PATTERN SENZA ATTRIBUTI GERARCHIA AM>
THEN <VALORE PESATO>
ELSE <VALORE NON PESATO> END
Se si vuole visualizzare un pattern con più attributi della gerarchia dell’arco multiplo, quale quello in questione, allora si deve effettuare l’AND delle condizioni grouping(attributo_arco_multiplo)=1 : WHEN (GROUPING(D.DOCENTE)=1 AND GROUPING(CD.CITTA )=1 AND GROUPING(CD.STATO)=1) Dove CD.STATO AS STATO_DOCENTE, CD.CITTA AS CITTA_DOCENTE, D.DOCENTE AS DOCENTE, 7 SELECT CD.STATO AS STATO_DOCENTE, CD.CITTA AS CITTA_DOCENTE, D.DOCENTE AS DOCENTE, CS.STATO AS STATO_STUDENTE, FACOLTA, SOST_P= SUM(SOST_P), SOST_I = CASE WHEN (GROUPING(D.DOCENTE)=1 AND GROUPING(CD.CITTA )=1 AND GROUPING(CD.STATO)=1) THEN SUM(SOST_P) ELSE SUM(SOST_I) END, VOTO_I = CASE WHEN (GROUPING(D.DOCENTE)=1 AND GROUPING(CD.CITTA )=1 AND GROUPING(CD.STATO)=1) THEN SUM(VOTO_P_SUM)/SUM(SOST_P) ELSE SUM(VOTO_SUM)/SUM(VOTO_NUM) END FROM FACT_TABLE_PD E JOIN DT_STUDENTE S ON (E.STUDENTE=S.STUDENTE) JOIN DT_DOCENTE D ON (E.DOCENTE=D.DOCENTE) JOIN DT_CITTA CD ON (CD.CITTA=D.CITTA) JOIN DT_CITTA CS ON (CS.CITTA=S.CITTA) JOIN DT_CORSO C ON (C.CORSO=E.CORSO) GROUP BY CD.STATO, CD.CITTA, D.DOCENTE, CS.STATO, FACOLTA WITH ROLLUP ORDER BY GROUPING(CD.STATO) DESC, GROUPING(CD.CITTA) DESC, GROUPING(FACOLTA) DESC, GROUPING(CS.STATO) DESC 8