4. Marco Pozzan
Lavoro con SQL server dalla versione 2000
Lavoro nella BI dal 2005
Presidente della community 1nn0va
(www.innovazionefvg.net)
Project manager del reparto Business
Intelligence della Servizi CGN (www.cgn.it)
Consulente SQL Server , DW
Riferimenti:
twitter: @marcopozzan
email: info@marcopozzan.it
site: www.marcopozzan.it
November 9th, 2013
#sqlsat257
#sqlsatverona
5. Agenda
Che cosa è Power Pivot?
Demo su Power Pivot
Che cosa è DAX?
Colonne calcolate e campi calcolati
Evaluation Context
Calculate
Demo in DAX
November 9th, 2013
#sqlsat257
#sqlsatverona
6. Che cosa è Powerpivot?
Free AddIn per Microsoft Excel 2010 e 2013
Diverse versioni per 32/64 bit
Non servono SQL Server o altri prerequisiti
Motore di analisi molto potente basato su
SSAS di SQL Server 2012
November 9th, 2013
#sqlsat257
#sqlsatverona
7. Versioni
Viene installato:
Client-side: dentro ad Excel
Server-side: Integrato su SharePoint o SQL
Server 2012(nuova istanza SSAS)
nella versione client-side l’engine SSAS gira inprocess con Excel
November 9th, 2013
#sqlsat257
#sqlsatverona
8. Nuovo engine SSAS 2012
Utilizza il motore Vertipaq che è un database
colonnare ad alta compressione
Lavora completamente in memoria
Niente I/O, aggregazioni o altro…
IMBI = Nuovo modo di pensare agli algoritmi
November 9th, 2013
#sqlsat257
#sqlsatverona
9. Powerpivot in velocità
Importare i dati
Relazioni tra tabelle
Slicer
November 9th, 2013
#sqlsat257
#sqlsatverona
10. Vantaggi PowerPivot
Rapidità
No ETL (Power Query)
Modello metadati
Integrazione sorgenti eterogenee
Condivisione
Soprattutto con Sharepoint
Espressività
Relazioni e Dax
November 9th, 2013
#sqlsat257
#sqlsatverona
11. Svantaggi PowerPivot
Non ci sono Etl per pulire i dati
Qualità del dato?
Volume di dati
Attenzione che questi non sono problemi!!!
Come potrebbero sembrare
November 9th, 2013
#sqlsat257
#sqlsatverona
12. Che cosa è DAX?
Progettato per lavorare all’interno di una
PivotTable
Linguaggio di programmazione del nuovo
SSAS si usa su PowerPivot e Tabular
Simile ad Excel (Dicono )
Nessun concetto di «riga» e «colonna»
Diverso sistema di tipi
Mix tra MDX, SQL, EXCEL
November 9th, 2013
#sqlsat257
#sqlsatverona
13. Tipi di dato in DAX
Non numerici:
String
Binary Objects (Power View)
Tipi numerici:
Currency
Integer
Real
DateTime
(intero: gg 30/12/1899, decimale: frazione del giorno)
TRUE / FALSE (Boolean)
November 9th, 2013
#sqlsat257
#sqlsatverona
14. Gestione dei Tipi
Gli operatori non sono strongly typed ("1"+1)
Il risultato dipende dall’operatore
Operator Overloading (pericoloso )
Esempio di conversioni
1 & 2 = "12"
"1" + "2" = 3
November 9th, 2013
#sqlsat257
#sqlsatverona
15. Colonne in DAX 1/2
'TableName’[ColumnName]
=FactInternetSales[OrderDate]
Gli apici possono essere omessi solo se la
TableName non contiene spazi (Non lo fate
)
November 9th, 2013
#sqlsat257
#sqlsatverona
16. Colonne in DAX 2/2
TableName può essere omesso e quindi
cercherà nella tabella corrente
Meglio non farlo in quanto si fatica a capire le
formule
=[OrderDate]
Le parentesi quadre sono obbligatorie
November 9th, 2013
#sqlsat257
#sqlsatverona
17. Colonne calcolate
Sono definite in Dax e sono persistite su DB
Usano altre colonne
Lavorano sempre nella «riga corrente»
Quando scrivo FactInternetSales[OrderDate]
Valore della colonna OrderDate
Nella tabella FactInternetSales
Per la riga corrente
Diverso per ogni riga
November 9th, 2013
#sqlsat257
#sqlsatverona
18. Misure (Calculated Fields)
Si scrivono con DAX
Non sono memorizzate sul DB
Non lavorano riga per riga
Usano tabelle ed aggregatori
Non hanno il concetto di «riga corrente»
Non posso scrivere la seguente formula
=FactInternetSales[OrderDate]
November 9th, 2013
#sqlsat257
#sqlsatverona
19. Definire i nomi giusti
Attenzione che se cambiate il nome delle
colonne bisogna cambiarlo manualmente
nella misure!!!
Quindi definite subito i nomi giusti
November 9th, 2013
#sqlsat257
#sqlsatverona
20. Colonne calcolate e Misure
Supponiamo di voler calcolare il margine con
una colonna calcolata:
=FactInternetSales[SalesAmount]-FactInternetSales[TotalProductCost]
Posso aggregare la colonna margine con
una misura
Margine:=SUM(FactInternetSales[Margine])
November 9th, 2013
#sqlsat257
#sqlsatverona
21. Colonne calcolate e Misure
% del margine rispetto al fatturato (margine%)
=FactInternetSales[Margine] / FactInternetSales[SalesAmount]
Questa espressione non va bene se la devo
calcolare riga per riga perchè
Devo usare una misura
Margine%:=SUM(FactInternetSales[Margine]) /
SUM(FactInternetSales[SalesAmount])
November 9th, 2013
#sqlsat257
#sqlsatverona
22. Considerazioni sulle Misure
Quando definiamo un misura bisogna:
Definire il nome della tabella a cui appartiene
Le misure sono globali al modello
Non ci possono essere due misure con lo stesso
nome in tabelle diverse
Si possono spostare da una tabella all’altra
questo non si può fare con le colonne calcolate
Non fare mai riferimento ad una misura con
la tabella si confonde con le colonne
calcolate
November 9th, 2013
#sqlsat257
#sqlsatverona
23. Conclusioni 1/2
Le colonne usano spazio e le misure CPU
Vengono calcolate in momenti diversi
Hanno scopi diversi
Hanno strutture diverse
Vengono gestite in modi diversi
November 9th, 2013
#sqlsat257
#sqlsatverona
24. Conclusioni 2/2
Misure quando (90%)
Si calcolano rapporti
Si calcolano percentuali
Si calcolano aggregazioni complesse
Colonne calcolate quando (10%)
Si necessita di slicer o filtri sui valori
L’espressione è calcolata sulla riga corrente
November 9th, 2013
#sqlsat257
#sqlsatverona
25. Funzioni conteggio
COUNTROWS: conta le righe in tabella
COUNTBLANK: conta i bianchi
COUNTA: conta tutto anche gli spazi
COUNT : conta solo le colonne numeriche
Per compatibilità con Excel
DISTINCTCOUNT: conta le righe distinte
Multidimensional -> measure group con una
misura distinctcount .. lenta come una lumaca
November 9th, 2013
#sqlsat257
#sqlsatverona
26. Errori DAX 1/2
È Possibile intercettare gli errori
[SalesAmount]/[Margin] potrebbe fallire
Errori di conversione
Operazioni aritmetiche
Valori vuoti o mancanti
ISERROR è una funzione che torna TRUE o
FALSE se c’è stato un errore o meno durante
la validazione
November 9th, 2013
#sqlsat257
#sqlsatverona
27. Errori DAX 2/2
IFERROR (Espressione, alternativa) è una
funzione che torna l’alternativa se c’è un
errore altrimenti l’espressione
Sia IFERROR e ISERROR sono molto lente
quindi fate attenzione a come le usate nelle
colonne calcolate
November 9th, 2013
#sqlsat257
#sqlsatverona
28. Funzioni di Aggregazione
Lavorano solo su colonne numeriche
Sono le seguenti:
SUM
AVERAGE
MIN
MAX
Aggrego solo colonne e NON espressioni
SUM(Order[Quantity])
SUM(Order[Quantity]) * Orders[Quantity])
November 9th, 2013
#sqlsat257
#sqlsatverona
29. Funzioni X di Aggregazione
Per aggregare espressioni devo usare le
funzioni X. Iterano sulla tabella e valutano
l’espressione per ogni riga
Ricevono due parametri la tabella su cui
iterare e la formula da valutare
Sono: SUMX,AVERAGEX,MINX,MAXX
SUMX (
Sales,
Sales[Price] * Sales[Quantity]
)
November 9th, 2013
#sqlsat257
#sqlsatverona
30. Dettaglio della funzione X
Prima calcola i parametri interni e poi fa la
somma
Le colonne devono essere tutte sulla stessa
tabella oppure uso RELATED (se c’è una
relazione)
Sono molto lente ma non uso Spazio
November 9th, 2013
#sqlsat257
#sqlsatverona
31. Alternativa alle funzioni X
In alternativa alle funzioni X devo creare una
colonna calcolata e poi aggregare su quella
colonna
Sono molto veloce ma uso spazio
November 9th, 2013
#sqlsat257
#sqlsatverona
32. Funzioni logiche
AND (poco usato) oppure si usa &&
OR (poco usato) oppure si usa ||
IF
IFERROR
NOT (poco usato)
SWITCH
November 9th, 2013
#sqlsat257
#sqlsatverona
33. Switch
Color :=
IF(DimProduct[Color] = "Red", "Rosso",
IF(DimProduct[Color] = "Yellow", "Giallo", "Altro"))
Color :=
Switch (
DimProduct[Color],
"Red", "Rosso",
"Yellow", "Giallo",
"Altro"
)
November 9th, 2013
#sqlsat257
#sqlsatverona
34. Funzioni informative
Completamente inutili (perché non prendono
le espressioni ma solo colonne)
ISNUMBER
ISTEXT
ISNONTEXT
Ma se non lo sappiamo noi (che abbiamo
creato la colonna) se è un numero o un
testo chi lo deve sapere (by Alberto Ferrari)
Utili
ISBLANK
ISERROR
November 9th, 2013
#sqlsat257
#sqlsatverona
35. Funzione DIVIDE
Con divide si evita di fare il controllo con IF
se il denominatore è 0
IF( Sales[Price] <> 0, Sales[Quantity] /
Sales[Price],0)
DIVIDE(Sales[Quantity], Sales[Price],0)
November 9th, 2013
#sqlsat257
#sqlsatverona
36. Funzioni sulle Date
Funzioni classiche per le date:
DATE ,DATEVALUE, DAY, EDATE,EMONTH
,HOUR, MINUTE, MONTH, NOW, SECOND, TI
ME, TIMEVALUE, TODAY
(interessante!!!), WEEKDAY, WEEKNUM, YEA
R, YEARFRANC
Funzioni Time intelligence
November 9th, 2013
#sqlsat257
#sqlsatverona
37. Evaluation context 1/3
Caratterizza DAX da qualsiasi altro
linguaggio
Sono simili alle clausole where delle query
MDX in SSAS
Contesto in cui viene valutata una formula
Filter Context , RowContext
November 9th, 2013
#sqlsat257
#sqlsatverona
38. Evaluation context 2/3
Filter Context:
Set di righe attive per il calcolo che poi vengono
aggregate.
Il filtro che viene dalla PivotTable è il filter
context.
Definito da filtri, righe ,colonne e slicers.
November 9th, 2013
#sqlsat257
#sqlsatverona
39. Evaluation context 3/3
Row Context:
Contiene una sola riga
Riga corrente durante i loop
Introdotto dalle formule X non dalla tabella Pivot
Questo concetto è nuovo rispetto MDX perché
non siamo abituati a lavorare foglia per foglia
ma solo sul contesto.
November 9th, 2013
#sqlsat257
#sqlsatverona
40. I due contesti esistono sempre…
Filter context:
Filtra le tabelle
Può essere vuoto: si vede solo il totale
Viene utilizzato dalle funzioni di aggregazione
In una colonna calcolata è pari a tutto il database
perché non c’è pivot table
Row context:
Naviga le righe attive nel filter context
Può essere vuoto: non ci sono iterazioni
November 9th, 2013
#sqlsat257
#sqlsatverona
42. I due contesti esistono sempre…
Filter context:
Il filtro si propaga dal lato uno al lato molti delle
relazioni
Le relazioni hanno un verso ed è molto
importante a differenza di SQL (inner,left,...)
si applica una volta sola (+ performance)
Row context:
Se ne frega delle relazioni
- performance (row context ha velocità)
Posso usare il comando RELATED
November 9th, 2013
#sqlsat257
#sqlsatverona
43. Esempio di Filter Context
November 9th, 2013
#sqlsat257
#sqlsatverona
44. Funzioni su tabelle (Table Functions)
Funzioni che ritornano tabelle:
FILTER
(aggiunge filtro ed è un iteratore!!!)
ALL
(rimuove filtri e restituisce o una colonna o una tabella)
VALUES
(valori di una colonna compresi i blank)
DISTINCT
(valori distinti di una colonna non mostra i blank)
RELATEDTABLE
(tutti i valori collegati alla riga corrente)
Il risultato si usa in altre funzioni e possono essere
combinate assieme
November 9th, 2013
#sqlsat257
#sqlsatverona
48. VALUES
Ritorna la tabella con una sola colonna
contenente tutti i possibili valori della colonna
visibili nel contesto corrente
Quando il risultato è formato da una colonna
e una riga può essere usato come scalare
AnniSelezionati:=COUNTROWS(VALUES(Dati[Year]))
November 9th, 2013
#sqlsat257
#sqlsatverona
49. RELATEDTABLE
Se mi trovo nella tabella degli store e voglio
sapere il numero di vendite per store uso la
RELATEDTABLE
=COUNTROWS (RELATEDTABLE(Dati))
November 9th, 2013
#sqlsat257
#sqlsatverona
50. Considerazioni
Per ora abbiamo visto che si può:
aggiunge filtro
rimuove filtri e restituire intera tabella o una
colonna
mixare i filtri
…..ma se volessi:
ignorare solo una parte del filter context e non
tutto?
aggiungere una condizione al filter context o
modificare una condizione esistente?
November 9th, 2013
#sqlsat257
#sqlsatverona
51. Calculate
E’ una funzione molto semplice ma complicata
CALCULATE(
Expression,
Filter1,
….
FiltroN
)
Valuto prima i filtri (AND) e poi l’espressione
I filtri rimpiazzano pezzi del contesto corrente
Dentro un filtro di calculate opero solo su una
colonna o sull’intera tabella
November 9th, 2013
#sqlsat257
#sqlsatverona
52. Calculate – ordine di valutazione
Ordine di valutazione
CALCULATE (
CALCULATE(
Espressione
ALL([Sales Territory Country])
);
[Sales Territory Country] = "Italy"
)
3
2
1
LA CALCULATE valuta il primo parametro dopo
aver valutato il secondo. Tutti i filtri sono
elaborati in parallelo e sono indipendenti l’uno
dall’altro.
November 9th, 2013
#sqlsat257
#sqlsatverona
53. Calculate – condizioni di filtro
Boolean conditions: lavora su singola
colonna e specifica una condizione da
rimpiazzare su una colonna esistente
SalesAmountWhite:=
CALCULATE(
SUM(FactInternetSales[SalesAmount]);
DimProduct[Color] = " White"
)
November 9th, 2013
#sqlsat257
#sqlsatverona
54. Calculate – condizioni di filtro
List of values: esattamente la lista di valori
che voglio vedere nel nuovo filtro. E’ sotto
forma di tabella e tutte le colonne della
tabella saranno parte del filtro
ProductM100 :=
CALCULATE(
SUM(FactInternetSales[SalesAmount]);
DimProduct[ListPrice] > 1000
)
November 9th, 2013
#sqlsat257
#sqlsatverona
55. Calculate – condizioni errate nel filtro
Quindi questa formula non posso scriverla
ProductLMC :=
CALCULATE(
SUM(FactInternetSales[SalesAmount]);
DimProduct[ListPrice] > DimProduct[StandardCost] ))
Il filtro è una boolean condition che lavora su una sola colonna e in questo caso
ci sono troppe colonne nell’espressione di filtro (ListPrice e StandardCost) quindi
va in errore
Quindi si usa il FILTER
ProductLMC :=
CALCULATE(
SUM(FactInternetSales[SalesAmount]);
FILTER(DimProduct,
DimProduct[ListPrice] > DimProduct[StandardCost] ))
November 9th, 2013
#sqlsat257
#sqlsatverona
57. Attenzione alle funzioni X
Queste due formule sono equivalenti:
Calculate TotX:=
CALCULATE(
SUMX(Dati;
Dati[Total Cost]
);
ALL(Dati[Quarter])
)
Calculate Tot:=
CALCULATE(
SUM( Dati[Total Cost]);
ALL(Dati[Quarter])
)
La versione senza X è più veloce
Non richiede iterazioni
November 9th, 2013
#sqlsat257
#sqlsatverona
58. Calculate – attenzione al filter context
Attenzione nella valutazione delle formule per
quanto riguardo il filter context con CALCULATE
ProductM100:=
CALCULATE (
SUM(FactInternetSales[SalesAmount]),
FILTER(
DimProduct,
DimProduct[ListPrice] >= 100
)
)
La DimProduct viene valutata nel filter context
originale prima che entri in gioco la CALCULATE
November 9th, 2013
#sqlsat257
#sqlsatverona
59. Calculate – attenzione al filter context
Attenzione nella valutazione delle formule per
quanto riguardo il filter context con CALCULATE
ProductM100_BIS:=
CALCULATE (
SUM(FactInternetSales[SalesAmount]),
FILTER(
ALL(DimProduct),
DimProduct[ListPrice] >= 100
)
)
La DimProduct subisce la ALL e il nuovo filter context
su cui verrà valutata la SUM sono tutte le colonne
November 9th, 2013
#sqlsat257
#sqlsatverona
60. Calculate – Context transition
Supponiamo di scrivere le seguenti colone calcolate nella
tabella DimProduct. Sono uguali?
= SUM(FactInternetSales[SalesAmount]);
= CALCULATE(SUM(FactInternetSales[SalesAmount]));
November 9th, 2013
#sqlsat257
#sqlsatverona
61. Calculate – Automatic Calculate
Vogliamo una colonna calcolata che per ogni prodotto e per
ogni cliente fornisca l’ammontare delle vendite.
Ammontare := SUM(FactInternetSales[SalesAmount])
Vendite =
SUMX(DimCustomer, Ammontare)
L’eleganza di CALCULATE
La misura Ammontare per effetto della Automatic Calculate
viene eseguita come fosse CALCULATE(Ammontare)
Questa viene eseguita in un row context per effetto della SUMX
Quindi si applica il context transition sul row context ottenendo un filter
context delle vendite del customer corrente per il prodotto corrente
Quella semplice espressione nella colonna calcolata estrae le righe di
vendita del prodotto per il cliente specifico per tutti i prodotti.
November 9th, 2013
#sqlsat257
#sqlsatverona
62. Analisi di Pareto e l’analisi ABC
L’80 % degli effetti viene dal 20 percento
delle cause
L’80% delle vendite proviene dal 20% dei clienti
L’analisi di pareto stà alla base della
classificazione ABC
Si classificano gli oggetti in questione secondo tre
classi
A = oggetti che portano >= 70% di guadagno
B = oggetti che portano >=20% < 70% di guadagno
C = oggetti che portano <20% di guadagno
November 9th, 2013
#sqlsat257
#sqlsatverona
63. Analisi di Pareto e l’analisi ABC
Per ogni riga il totale venduto TotalSales
=CALCULATE( SUM(FactInternetSales[SalesAmount]))
Calcolare tutti i prodotti con il totale venduto
maggiore al venduto del prodotto della riga
RunningTotalSales
= SUMX(
FILTER(
DimProduct;
DimProduct[TotalSales] >= EARLIER(DimProduct[TotalSales])
);
DimProduct[TotalSales]
)
November 9th, 2013
#sqlsat257
#sqlsatverona
64. Analisi di Pareto e l’analisi ABC
calcolare la percentuale delle vendite per
quel prodotto rispetto al totale delle vendite
=DimProduct[RunningTotalSales] / SUM(DimProduct[TotalSales])
Con degli IF visualizziamo le etichette A,B,C
=IF(
DimProduct[RunningPct] <= 0.7;
"A";
IF(
DimProduct[RunningPct] < =0.9;
"B";
"C";
)
)
November 9th, 2013
#sqlsat257
#sqlsatverona
65. Analisi di Pareto e l’analisi ABC
Se volessi vedere anche il numero di prodotti
chegenerano quei fatturati uso la seguente
misura
=COUNTROWS(DimProduct)
November 9th, 2013
#sqlsat257
#sqlsatverona
66. Analisi di Pareto e l’analisi ABC
November 9th, 2013
#sqlsat257
#sqlsatverona
67. Link and Book
PowerPivot
http://www.powerpivot.com
SQLBI
http://www.sqlbi.com
Libro di riferimento
November 9th, 2013
#sqlsat257
#sqlsatverona