Successfully reported this slideshow.
We use your LinkedIn profile and activity data to personalize ads and to show you more relevant ads. You can change your ad preferences anytime.
SQL Saturday #257
Verona, Italy
Introduction DAX

09/11/2013 |

November

9th,

SQL Saturday #257 – Verona, Italy

2013

#...
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
(w...
Agenda








Che cosa è Power Pivot?
Demo su Power Pivot
Che cosa è DAX?
Colonne calcolate e campi calcolati
Eval...
Che cosa è Powerpivot?





Free AddIn per Microsoft Excel 2010 e 2013
Diverse versioni per 32/64 bit
Non servono SQL ...
Versioni
 Viene installato:
 Client-side: dentro ad Excel
 Server-side: Integrato su SharePoint o SQL
Server 2012(nuova...
Nuovo engine SSAS 2012
 Utilizza il motore Vertipaq che è un database
colonnare ad alta compressione
 Lavora completamen...
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

 Condivision...
Svantaggi PowerPivot
 Non ci sono Etl per pulire i dati
 Qualità del dato?
 Volume di dati

 Attenzione che questi non...
Che cosa è DAX?
 Progettato per lavorare all’interno di una
PivotTable
 Linguaggio di programmazione del nuovo
SSAS si u...
Tipi di dato in DAX
 Non numerici:
 String
 Binary Objects (Power View)

 Tipi numerici:





Currency
Integer
Rea...
Gestione dei Tipi







Gli operatori non sono strongly typed ("1"+1)
Il risultato dipende dall’operatore
Operator ...
Colonne in DAX 1/2
 'TableName’[ColumnName]
=FactInternetSales[OrderDate]

 Gli apici possono essere omessi solo se la
T...
Colonne in DAX 2/2
 TableName può essere omesso e quindi
cercherà nella tabella corrente
 Meglio non farlo in quanto si ...
Colonne calcolate





Sono definite in Dax e sono persistite su DB
Usano altre colonne
Lavorano sempre nella «riga co...
Misure (Calculated Fields)






Si scrivono con DAX
Non sono memorizzate sul DB
Non lavorano riga per riga
Usano tab...
Definire i nomi giusti
 Attenzione che se cambiate il nome delle
colonne bisogna cambiarlo manualmente
nella misure!!!
 ...
Colonne calcolate e Misure
 Supponiamo di voler calcolare il margine con
una colonna calcolata:
=FactInternetSales[SalesA...
Colonne calcolate e Misure
 % del margine rispetto al fatturato (margine%)
=FactInternetSales[Margine] / FactInternetSale...
Considerazioni sulle Misure
 Quando definiamo un misura bisogna:
 Definire il nome della tabella a cui appartiene

 Le ...
Conclusioni 1/2






Le colonne usano spazio e le misure CPU
Vengono calcolate in momenti diversi
Hanno scopi divers...
Conclusioni 2/2
 Misure quando (90%)
 Si calcolano rapporti
 Si calcolano percentuali
 Si calcolano aggregazioni compl...
Funzioni conteggio





COUNTROWS: conta le righe in tabella
COUNTBLANK: conta i bianchi
COUNTA: conta tutto anche gli...
Errori DAX 1/2
 È Possibile intercettare gli errori
 [SalesAmount]/[Margin] potrebbe fallire
 Errori di conversione
 O...
Errori DAX 2/2
 IFERROR (Espressione, alternativa) è una
funzione che torna l’alternativa se c’è un
errore altrimenti l’e...
Funzioni di Aggregazione
 Lavorano solo su colonne numeriche
 Sono le seguenti:





SUM
AVERAGE
MIN
MAX

 Aggrego ...
Funzioni X di Aggregazione
 Per aggregare espressioni devo usare le
funzioni X. Iterano sulla tabella e valutano
l’espres...
Dettaglio della funzione X
 Prima calcola i parametri interni e poi fa la
somma
 Le colonne devono essere tutte sulla st...
Alternativa alle funzioni X
 In alternativa alle funzioni X devo creare una
colonna calcolata e poi aggregare su quella
c...
Funzioni logiche







AND (poco usato) oppure si usa &&
OR (poco usato) oppure si usa ||
IF
IFERROR
NOT (poco usat...
Switch
Color :=
IF(DimProduct[Color] = "Red", "Rosso",
IF(DimProduct[Color] = "Yellow", "Giallo", "Altro"))

Color :=
Swit...
Funzioni informative
 Completamente inutili (perché non prendono
le espressioni ma solo colonne)
 ISNUMBER
 ISTEXT
 IS...
Funzione DIVIDE
 Con divide si evita di fare il controllo con IF
se il denominatore è 0
 IF( Sales[Price] <> 0, Sales[Qu...
Funzioni sulle Date
 Funzioni classiche per le date:
DATE ,DATEVALUE, DAY, EDATE,EMONTH
,HOUR, MINUTE, MONTH, NOW, SECOND...
Evaluation context 1/3
 Caratterizza DAX da qualsiasi altro
linguaggio
 Sono simili alle clausole where delle query
MDX ...
Evaluation context 2/3
 Filter Context:
 Set di righe attive per il calcolo che poi vengono
aggregate.
 Il filtro che v...
Evaluation context 3/3
 Row Context:





Contiene una sola riga
Riga corrente durante i loop
Introdotto dalle formul...
I due contesti esistono sempre…
 Filter context:





Filtra le tabelle
Può essere vuoto: si vede solo il totale
Vien...
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 r...
Esempio di Filter Context

November 9th, 2013

#sqlsat257
#sqlsatverona
Funzioni su tabelle (Table Functions)
 Funzioni che ritornano tabelle:
 FILTER
 (aggiunge filtro ed è un iteratore!!!)
...
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 c...
RELATEDTABLE

 Se mi trovo nella tabella degli store e voglio
sapere il numero di vendite per store uso la
RELATEDTABLE
=...
Considerazioni
 Per ora abbiamo visto che si può:
 aggiunge filtro
 rimuove filtri e restituire intera tabella o una
co...
Calculate
 E’ una funzione molto semplice ma complicata
 CALCULATE(
Expression,
Filter1,
….
FiltroN

)

 Valuto prima i...
Calculate – ordine di valutazione
 Ordine di valutazione
CALCULATE (
CALCULATE(
Espressione
ALL([Sales Territory Country]...
Calculate – condizioni di filtro
 Boolean conditions: lavora su singola
colonna e specifica una condizione da
rimpiazzare...
Calculate – condizioni di filtro
 List of values: esattamente la lista di valori
che voglio vedere nel nuovo filtro. E’ s...
Calculate – condizioni errate nel filtro
 Quindi questa formula non posso scriverla
ProductLMC :=
CALCULATE(
SUM(FactInte...
Calculate

November 9th, 2013

#sqlsat257
#sqlsatverona
Attenzione alle funzioni X
 Queste due formule sono equivalenti:
Calculate TotX:=
CALCULATE(
SUMX(Dati;
Dati[Total Cost]
...
Calculate – attenzione al filter context
 Attenzione nella valutazione delle formule per
quanto riguardo il filter contex...
Calculate – attenzione al filter context
 Attenzione nella valutazione delle formule per
quanto riguardo il filter contex...
Calculate – Context transition
 Supponiamo di scrivere le seguenti colone calcolate nella
tabella DimProduct. Sono uguali...
Calculate – Automatic Calculate
 Vogliamo una colonna calcolata che per ogni prodotto e per
ogni cliente fornisca l’ammon...
Analisi di Pareto e l’analisi ABC
 L’80 % degli effetti viene dal 20 percento
delle cause
 L’80% delle vendite proviene ...
Analisi di Pareto e l’analisi ABC
 Per ogni riga il totale venduto TotalSales
=CALCULATE( SUM(FactInternetSales[SalesAmou...
Analisi di Pareto e l’analisi ABC
 calcolare la percentuale delle vendite per
quel prodotto rispetto al totale delle vend...
Analisi di Pareto e l’analisi ABC

 Se volessi vedere anche il numero di prodotti
chegenerano quei fatturati uso la segue...
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, ...
Q&A

November 9th, 2013

#sqlsat257
#sqlsatverona
#sqlsat257
#sqlsatverona

Thanks!

November 9th, 2013

#sqlsat257
#sqlsatverona
Upcoming SlideShare
Loading in …5
×

Introduction Dax

900 views

Published on

SQL Saturday #257 Verona

  • Molto interessante
       Reply 
    Are you sure you want to  Yes  No
    Your message goes here

Introduction Dax

  1. 1. SQL Saturday #257 Verona, Italy Introduction DAX 09/11/2013 | November 9th, SQL Saturday #257 – Verona, Italy 2013 #sqlsat257 #sqlsatverona
  2. 2. Sponsor & Media Partners November 9th, 2013 #sqlsat257 #sqlsatverona
  3. 3. Organizers November 9th, 2013 #sqlsat257 #sqlsatverona
  4. 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. 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. 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. 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. 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. 9. Powerpivot in velocità  Importare i dati  Relazioni tra tabelle  Slicer November 9th, 2013 #sqlsat257 #sqlsatverona
  10. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 41. Con più tabelle? November 9th, 2013 #sqlsat257 #sqlsatverona
  42. 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. 43. Esempio di Filter Context November 9th, 2013 #sqlsat257 #sqlsatverona
  44. 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
  45. 45. Filter November 9th, 2013 #sqlsat257 #sqlsatverona
  46. 46. All November 9th, 2013 #sqlsat257 #sqlsatverona
  47. 47. Mescolare i filtri November 9th, 2013 #sqlsat257 #sqlsatverona
  48. 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. 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. 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. 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. 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. 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. 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. 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
  56. 56. Calculate November 9th, 2013 #sqlsat257 #sqlsatverona
  57. 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. 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. 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. 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. 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. 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. 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. 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. 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. 66. Analisi di Pareto e l’analisi ABC November 9th, 2013 #sqlsat257 #sqlsatverona
  67. 67. Link and Book  PowerPivot http://www.powerpivot.com  SQLBI http://www.sqlbi.com  Libro di riferimento November 9th, 2013 #sqlsat257 #sqlsatverona
  68. 68. Q&A November 9th, 2013 #sqlsat257 #sqlsatverona
  69. 69. #sqlsat257 #sqlsatverona Thanks! November 9th, 2013 #sqlsat257 #sqlsatverona

×