MicroStrategy ONE
Conserva tutti gli elementi della tabella di ricerca
La proprietà VLDB Conserva tutti gli elementi della tabella di ricerca viene utilizzata per mostrare tutti gli elementi attributi presenti nella tabella di ricerca, anche in assenza di un fatto corrispondente nel set di risultati. Ad esempio, il report contiene Negozio e Sum(Vendite) ed è possibile che a un negozio non sia associata alcuna vendita. Può tuttavia essere utile inserire tutti i nomi dei negozi nel report finale, compresi quelli che non hanno registrato vendite. A tale scopo, non è possibile utilizzare i negozi della tabella dei fatti Vendite. Bisogna invece accertarsi che tutti i negozi della tabella di lookup siano inseriti nel report finale. Il motore SQL deve utilizzare un join esterno sinistro dalla tabella di ricerca alla tabella dei fatti.
È possibile che vi siano più attributi sul modello. Per mantenere tutti gli elementi di attributo, il motore analitico deve utilizzare un join cartesiano tra le tabelle di ricerca degli attributi coinvolte, prima di eseguire un join esterno sinistro alla tabella dei fatti.
Conserva gli elementi comuni della tabella dei risultati del passaggio finale e lookup (impostazione predefinita).
Il motore analitico esegue un join normale alla tabella di ricerca.
Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base alle chiavi della tabella fatti.
Il livello della tabella dei fatti non è sempre identico a quello del report o del modello. Ad esempio, un report contiene le metriche Negozio, Mese e Sum(Vendite), ma la tabella dei fatti è a livello di Negozio, Giorno e Articolo. Esistono due modi per mantenere tutti gli elementi del negozio e del mese:
- Eseguire dapprima un join esterno sinistro per conservare tutti gli elementi attributo a livello Negozio, Giorno e Articolo, quindi aggregare a livello Negozio e Mese.
- Effettuare dapprima l'aggregazione, quindi eseguire un join esterno sinistro per raggruppare tutti gli elementi attributo.
Questa opzione è valida per il primo approccio. Nell'esempio fornito in precedenza, esegue due passaggi SQL:
Passaggio 1: join incrociato LOOKUP_STORE LOOKUP_DAY join incrociato LOOKUP_ITEM èTT1
Passaggio 2: join esterno sinistro TT1 Fact_Table in data (store, giorno, elemento)
Il vantaggio di questo approccio è che si può eseguire un join esterno sinistro e l'aggregazione nello stesso passaggio (2). Lo svantaggio consiste nel fatto che, poiché si esegue un join cartesiano con le tabelle di ricerca a un livello inferiore (passaggio 1), il risultato della tabella unita in join cartesiano (TT1) può essere molto esteso.
Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base agli attributi di modello senza filtro.
Questa opzione corrisponde al secondo approccio descritto sopra. Sempre usando lo stesso esempio, effettuare tre passaggi SQL:
- Passaggio 1: aggrega Fact_Table su TT1 in Store e Month. Si tratta del passaggio finale di un report normale quando non viene attivata questa impostazione.
- Passaggio 2: join incrociato LOOKUP_STORE LOOKUP_MONTH> TT2
- Passaggio 3: join esterno sinistro TT2 TT1 attivato (store, mese)
Questo approccio necessita di un passaggio in più rispetto all'opzione precedente, ma la tabella dei join incrociati (TT2) è solitamente più ridotta.
Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base agli attributi di modello con filtro.
Questa opzione è simile all'Opzione 3. In questo caso però il filtro di report viene applicato nel passaggio finale (Passaggio 3). Ad esempio, un report contiene Negozio, Mese e Totale (Vendite) con il filtro Anno = 2002. Si desidera visualizzare ciascun negozio in ogni mese del 2002, indipendentemente dal fatto che vi siano vendite. Tuttavia, si desidera prendere in esame solo i 12 mesi del 2002, non quelli di altri anni. L'opzione 4 risolve il problema.
Esempio
Il Mantieni gli elementi comuni della tabella di ricerca e della tabella dei risultati del passaggio finale genera semplicemente un join diretto tra la tabella dei fatti e la tabella di ricerca. I risultati e SQL sono i seguenti.
Negozio | Vendite in dollari |
Est |
5000 |
Centro |
8000 |
Sud |
12000 |
select a11.Store_id Store_id,
max(a12.Store) Store,
sum(a11.DollarSls) WJXBFS1
from Fact a11
join Store a12
attivo (a11.Store_id = a12.Store_id)
group by a11.Store_id
L'opzione "Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base ai fatti chiave" crea una tabella temporanea che è un join cartesiano di tutte le colonne chiave della tabella di ricerca. Quindi la tabella dei fatti è unita esternamente alla tabella temporanea. Ciò conserva tutti gli elementi della tabella di ricerca. I risultati e SQL sono i seguenti:
Negozio | Vendite in dollari |
Est |
5000 |
Centro |
8000 |
Sud |
12000 |
Nord |
|
select distinct a11.Year Year
in #ZZOL00
from Fact a11
select pa1.Year Year,
a11.Store_id Store_id
in #ZZOL01
from #ZZOL00 pa1
cross join Store a11
seleziona pa2.Store_id Store_id,
max(a12.Store) Store,
sum(a11.DollarSls) WJXBFS1
da #ZZOL01 pa2
left outer join Fact a11
on (pa2.Store_id = a11.Store_id and
pa2.Year = a11.Year)
join Store a12
on (pa2.Store_id = a12.Store_id)
raggruppa per pa2.Store_id
tabella di trascinamento #ZZOL00
tabella di discesa #ZZOL01
Selezionando l'opzione "Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base agli attributi di modello senza filtro" conserva gli elementi della tabella di ricerca per unione esterna sinistra al passaggio finale di SQL e solo su attributi presenti nel modello. Per questo esempio e il successivo, viene aggiunto il filtro di "Negozio non uguale a Centrale". I risultati e SQL sono i seguenti:
Negozio | Vendite in dollari |
Est |
5000 |
Centro |
|
Sud |
12000 |
Nord |
|
select a11.Store_id Store_id,
sum(a11.DollarSls) WJXBFS1
in #ZZT5X00003UOL000
from Fact a11
where a11.Store_id not in (2)
group by a11.Store_id
select a11.Store_id Store_id,
a11.Store Store,
pa1.WJXBFS1 WJXBFS1
from Store a11
join esterno sinistro #ZZT5X00003UOL000 pa1
acceso (a11.Store_id = pa1.Store_id)
tabella di discesa #ZZT5X00003UOL000
L'opzione "Conserva gli elementi della tabella di ricerca uniti alla tabella dei risultati del passaggio finale in base agli attributi di modello con filtro" è la più recente ed è la stessa di sopra, ma si ottiene il filtro nel passaggio finale. I risultati e SQL sono i seguenti:
Negozio | Vendite in dollari |
Est |
5000 |
Sud |
12000 |
Nord |
|
select a11.Store_id Store_id,
sum(a11.DollarSls) WJXBFS1
in #ZZT5X00003XOL000
from Fact a11
where a11.Store_id not in (2)
group by a11.Store_id
select a11.Store_id Store_id,
a11.Store Store,
pa1.WJXBFS1 WJXBFS1
from Store a11
left outer join #ZZT5X00003XOL000 pa1
acceso (a11.Store_id = pa1.Store_id)
where a11.Store_id not in (2)
drop table #ZZT5X00003XOL000