SlideShare una empresa de Scribd logo
1 de 69
Descargar para leer sin conexión
SQL Saturday #257
Verona, Italy
Introduction DAX

09/11/2013 |

November

9th,

SQL Saturday #257 – Verona, Italy

2013

#sqlsat257
#sqlsatverona
Sponsor & Media Partners

November 9th, 2013

#sqlsat257
#sqlsatverona
Organizers

November 9th, 2013

#sqlsat257
#sqlsatverona
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
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
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
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
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
Powerpivot in velocità
 Importare i dati
 Relazioni tra tabelle
 Slicer

November 9th, 2013

#sqlsat257
#sqlsatverona
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
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
Con più tabelle?

November 9th, 2013

#sqlsat257
#sqlsatverona
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
Esempio di Filter Context

November 9th, 2013

#sqlsat257
#sqlsatverona
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
Filter

November 9th, 2013

#sqlsat257
#sqlsatverona
All

November 9th, 2013

#sqlsat257
#sqlsatverona
Mescolare i filtri

November 9th, 2013

#sqlsat257
#sqlsatverona
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
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
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
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
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
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
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
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
Calculate

November 9th, 2013

#sqlsat257
#sqlsatverona
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
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
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
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
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
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
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
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
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
Analisi di Pareto e l’analisi ABC

November 9th, 2013

#sqlsat257
#sqlsatverona
Link and Book
 PowerPivot
http://www.powerpivot.com

 SQLBI
http://www.sqlbi.com

 Libro di riferimento

November 9th, 2013

#sqlsat257
#sqlsatverona
Q&A

November 9th, 2013

#sqlsat257
#sqlsatverona
#sqlsat257
#sqlsatverona

Thanks!

November 9th, 2013

#sqlsat257
#sqlsatverona

Más contenido relacionado

Similar a Introduction Dax

[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control
[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control
[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source controlAlessandro Alpi
 
Il foglio elettronico a supporto dell’attività professionale [AP03-S]
Il foglio elettronico a supporto dell’attività professionale [AP03-S]Il foglio elettronico a supporto dell’attività professionale [AP03-S]
Il foglio elettronico a supporto dell’attività professionale [AP03-S]Andrea Maddalena
 
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgroundsAlessandro Alpi
 
[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source control[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source controlAlessandro Alpi
 
Acadevmy - GraphQL & Angular: Tutto il REST è noia!
Acadevmy - GraphQL & Angular: Tutto il REST è noia!Acadevmy - GraphQL & Angular: Tutto il REST è noia!
Acadevmy - GraphQL & Angular: Tutto il REST è noia!Francesco Sciuti
 
VISUS RAD - Generazione dell'applicazione
VISUS RAD -  Generazione dell'applicazioneVISUS RAD -  Generazione dell'applicazione
VISUS RAD - Generazione dell'applicazioneandrearocchini
 
TSQL Advanced Query Techniques
TSQL Advanced Query TechniquesTSQL Advanced Query Techniques
TSQL Advanced Query TechniquesGianluca Sartori
 
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebMassimiliano Dessì
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]Andrea Maddalena
 
Digital 1nn0vation saturday pn 2019 - ML.NET
Digital 1nn0vation saturday pn 2019 - ML.NETDigital 1nn0vation saturday pn 2019 - ML.NET
Digital 1nn0vation saturday pn 2019 - ML.NETMarco Zamana
 

Similar a Introduction Dax (20)

[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control
[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control
[ITA] Sql Saturday 355 in Parma - New SQL Server databases under source control
 
Il foglio elettronico a supporto dell’attività professionale [AP03-S]
Il foglio elettronico a supporto dell’attività professionale [AP03-S]Il foglio elettronico a supporto dell’attività professionale [AP03-S]
Il foglio elettronico a supporto dell’attività professionale [AP03-S]
 
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
[ITA] SQL Saturday 264 - Put databases in ALM backgrounds
 
[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source control[ITA] SQL Saturday 257 - Put databases under source control
[ITA] SQL Saturday 257 - Put databases under source control
 
Basi Di Dati 05
Basi Di Dati 05Basi Di Dati 05
Basi Di Dati 05
 
SQL Server2000
SQL Server2000SQL Server2000
SQL Server2000
 
xVelocity in Deep
xVelocity in DeepxVelocity in Deep
xVelocity in Deep
 
Acadevmy - GraphQL & Angular: Tutto il REST è noia!
Acadevmy - GraphQL & Angular: Tutto il REST è noia!Acadevmy - GraphQL & Angular: Tutto il REST è noia!
Acadevmy - GraphQL & Angular: Tutto il REST è noia!
 
Riepilogo Java C/C++
Riepilogo Java C/C++Riepilogo Java C/C++
Riepilogo Java C/C++
 
VISUS RAD - Generazione dell'applicazione
VISUS RAD -  Generazione dell'applicazioneVISUS RAD -  Generazione dell'applicazione
VISUS RAD - Generazione dell'applicazione
 
Oracle PL sql 1
Oracle PL sql 1Oracle PL sql 1
Oracle PL sql 1
 
Basi Di Dati 03
Basi Di Dati 03Basi Di Dati 03
Basi Di Dati 03
 
TSQL Advanced Query Techniques
TSQL Advanced Query TechniquesTSQL Advanced Query Techniques
TSQL Advanced Query Techniques
 
Lezione JSP database Crud
Lezione JSP database CrudLezione JSP database Crud
Lezione JSP database Crud
 
Sql stored procedures
Sql stored proceduresSql stored procedures
Sql stored procedures
 
Sql ddl
Sql ddlSql ddl
Sql ddl
 
Lezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparteLezione js pdatabasecrudterzaparte
Lezione js pdatabasecrudterzaparte
 
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis WebSpring, IBatis e Transazioni Aop Nel Jug Avis Web
Spring, IBatis e Transazioni Aop Nel Jug Avis Web
 
noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]noSQL La nuova frontiera dei Database [DB05-S]
noSQL La nuova frontiera dei Database [DB05-S]
 
Digital 1nn0vation saturday pn 2019 - ML.NET
Digital 1nn0vation saturday pn 2019 - ML.NETDigital 1nn0vation saturday pn 2019 - ML.NET
Digital 1nn0vation saturday pn 2019 - ML.NET
 

Más de Marco Pozzan

Metadata Driven Pipeline with Microsoft Fabric
Metadata Driven Pipeline  with Microsoft FabricMetadata Driven Pipeline  with Microsoft Fabric
Metadata Driven Pipeline with Microsoft FabricMarco Pozzan
 
Data Warehouse with Fabric on data lakehouse
Data Warehouse with Fabric on data lakehouseData Warehouse with Fabric on data lakehouse
Data Warehouse with Fabric on data lakehouseMarco Pozzan
 
Data modelling for Power BI
Data modelling for Power BIData modelling for Power BI
Data modelling for Power BIMarco Pozzan
 
SlideModellingDataSat.pdf
SlideModellingDataSat.pdfSlideModellingDataSat.pdf
SlideModellingDataSat.pdfMarco Pozzan
 
Quanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseQuanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseMarco Pozzan
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-serviceMarco Pozzan
 
Microsoft Power BI fast with aggregation and composite model
Microsoft Power BI fast with aggregation and composite modelMicrosoft Power BI fast with aggregation and composite model
Microsoft Power BI fast with aggregation and composite modelMarco Pozzan
 
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZURE
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZUREREAL TIME ANALYTICS INFRASTRUCTURE WITH AZURE
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZUREMarco Pozzan
 
Big data analytics quanto vale e come sfruttarlo con stream analytics e power bi
Big data analytics quanto vale e come sfruttarlo con stream analytics e power biBig data analytics quanto vale e come sfruttarlo con stream analytics e power bi
Big data analytics quanto vale e come sfruttarlo con stream analytics e power biMarco Pozzan
 
What is in reality a DAX filter context
What is in reality a DAX filter contextWhat is in reality a DAX filter context
What is in reality a DAX filter contextMarco Pozzan
 
Azure saturday pn 2018
Azure saturday pn 2018Azure saturday pn 2018
Azure saturday pn 2018Marco Pozzan
 
Power B: Cleaning data
Power B: Cleaning dataPower B: Cleaning data
Power B: Cleaning dataMarco Pozzan
 
Power bi Clean and Modelling (SQL Saturday #675)
Power bi Clean and Modelling  (SQL Saturday #675)Power bi Clean and Modelling  (SQL Saturday #675)
Power bi Clean and Modelling (SQL Saturday #675)Marco Pozzan
 
Power BI and business application platform
Power BI and business application platformPower BI and business application platform
Power BI and business application platformMarco Pozzan
 

Más de Marco Pozzan (20)

Metadata Driven Pipeline with Microsoft Fabric
Metadata Driven Pipeline  with Microsoft FabricMetadata Driven Pipeline  with Microsoft Fabric
Metadata Driven Pipeline with Microsoft Fabric
 
Data Warehouse with Fabric on data lakehouse
Data Warehouse with Fabric on data lakehouseData Warehouse with Fabric on data lakehouse
Data Warehouse with Fabric on data lakehouse
 
Data modelling for Power BI
Data modelling for Power BIData modelling for Power BI
Data modelling for Power BI
 
SlideModellingDataSat.pdf
SlideModellingDataSat.pdfSlideModellingDataSat.pdf
SlideModellingDataSat.pdf
 
Datamart.pdf
Datamart.pdfDatamart.pdf
Datamart.pdf
 
Datamart.pptx
Datamart.pptxDatamart.pptx
Datamart.pptx
 
Quanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless SynapseQuanto mi costa SQL Pool Serverless Synapse
Quanto mi costa SQL Pool Serverless Synapse
 
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-servicePower BI: Introduzione ai dataflow e alla preparazione dei dati self-service
Power BI: Introduzione ai dataflow e alla preparazione dei dati self-service
 
Data flow
Data flowData flow
Data flow
 
Microsoft Power BI fast with aggregation and composite model
Microsoft Power BI fast with aggregation and composite modelMicrosoft Power BI fast with aggregation and composite model
Microsoft Power BI fast with aggregation and composite model
 
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZURE
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZUREREAL TIME ANALYTICS INFRASTRUCTURE WITH AZURE
REAL TIME ANALYTICS INFRASTRUCTURE WITH AZURE
 
Big data analytics quanto vale e come sfruttarlo con stream analytics e power bi
Big data analytics quanto vale e come sfruttarlo con stream analytics e power biBig data analytics quanto vale e come sfruttarlo con stream analytics e power bi
Big data analytics quanto vale e come sfruttarlo con stream analytics e power bi
 
What is in reality a DAX filter context
What is in reality a DAX filter contextWhat is in reality a DAX filter context
What is in reality a DAX filter context
 
Azure saturday pn 2018
Azure saturday pn 2018Azure saturday pn 2018
Azure saturday pn 2018
 
Power B: Cleaning data
Power B: Cleaning dataPower B: Cleaning data
Power B: Cleaning data
 
Power bi Clean and Modelling (SQL Saturday #675)
Power bi Clean and Modelling  (SQL Saturday #675)Power bi Clean and Modelling  (SQL Saturday #675)
Power bi Clean and Modelling (SQL Saturday #675)
 
Power BI and business application platform
Power BI and business application platformPower BI and business application platform
Power BI and business application platform
 
Power bi + Flow
Power bi + FlowPower bi + Flow
Power bi + Flow
 
Power BI
Power BIPower BI
Power BI
 
Power query
Power queryPower query
Power query
 

Introduction Dax

  • 1. SQL Saturday #257 Verona, Italy Introduction DAX 09/11/2013 | November 9th, SQL Saturday #257 – Verona, Italy 2013 #sqlsat257 #sqlsatverona
  • 2. Sponsor & Media Partners November 9th, 2013 #sqlsat257 #sqlsatverona
  • 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
  • 41. Con più tabelle? 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
  • 47. Mescolare i filtri 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