Autogenerate() e gestione date

Chi mastica un po’ la Business Intelligence e conosce un po’ di letteratura “tradizionale” su OLAP e Data Warehousing sa bene che, nella progettazione di una nuova base dati che debba accogliere uno “schema a stella”, giocano un ruolo fondamentale i campi contenenti DATE. Esse saranno collocate in una tabella di “Dimensioni” e dovranno contenere tutte le possibili rappresentazioni che possano poi far comodo all’utente finale: Anno, Annomese, Trimestre, Quadrimestre, Mese, Giorno, Settimana…

Con QlikView – senza stare a rimarcare l’indubbio vantaggio di non dover progettare alcun Data Warehouse, né tantomeno concepire uno schema a stella di fatti e dimensioni – la cosa può essere comunque vista come uno spunto interessante per imparare un “trucco” che torna utile in situazioni diverse e disparate: la funzione “Autogenerate(n)”. Tale funzione sostituisce l’istruzione di “From” (o di “Resident”) e non fa altro che generare una tabella con un numero di righe pari al valore “n” indicato tra parentesi, con colonne definibili nell’istruzione di Load.

Immaginiamo di dover costruire un semplice foglio di analisi degli ordini cliente dell’azienda ACME spa dove, ovviamente, le date giocano un ruolo fondamentale: l’inconveniente è che, per una analisi davvero completa, sarebbe interessante che il cruscotto contenesse anche quei giorni in cui non ci sono stati ordini (per contarli, confrontarli, utilizzarli in una tabella di riepilogo), ma è evidente che, se a comandare è proprio la tabella degli ordini, essa non conterrà che le sole righe in cui almeno un ordine è stato emesso.

Per ovviare a questo inconveniente si può utilizzare la funzione “Autogenerate()” che fornisce lo strumento adeguato a costruire un calendario completo da “agganciare” al campo data della tabella ordini per avere a disposizione ogni giorno dell’anno, a prescindere dalla presenza o meno di un ordine nella tabella.

Di seguito un esempio di codice che assume che la tabella degli ordini si chiami, con un guizzo di originalità, “ordini_clienti” ed il campo che contiene le date “data_ordine”:

MinMaxDataOrdine: Load
min(data_ordine) as min_data,
max(data_ordine) as max_data;
SQL SELECT data_ordine FROM ordini_clienti;
 
Let var_min_data = FieldValue('min_data', 1); Let var_max_data = FieldValue('max_data', 1);
Drop Table MinMaxDataOrdine;
 
Load
data_ordine,
day(data_ordine) as giorno,
dayname(data_ordine) as nomeGiorno,
weekday(data_ordine) as giornoSettimana,
week(data_ordine) as settimana,
month(data_ordine) as mese,
monthName(data_ordine) as meseNome,
QuarterName(data_ordine) as trimestre,
Year(data_ordine) as anno;
Load
date(floor(recno()+$(var_min_data)-1)) as data_ordine
Autogenerate(var_max_data - var_min_data + 1);

Il senso di questa porzione di script è quello di reperire il Minimo e Massimo delle “date_ordine” (ma la logica di costruzione del calendario potrebbe essere diversa) per poi usare il numero di giorni che intercorre fra queste due date come numero di righe da far creare alla funzione “Autogenerate()” e la data minima come data di partenza che su ogni riga viene incrementata di uno.

Il risultato è un calendario completo che va da “var_min_data” a “var_max_data”, il quale, grazie al campo “data_ordine”, si aggancia alle date della tabella ordini.