Introduction Dax
Upcoming SlideShare
Loading in...5
×
 

Introduction Dax

on

  • 501 views

SQL Saturday #257 Verona

SQL Saturday #257 Verona

Statistics

Views

Total Views
501
Views on SlideShare
371
Embed Views
130

Actions

Likes
1
Downloads
3
Comments
1

2 Embeds 130

http://marcopozzan.it 78
http://www.marcopozzan.it 52

Accessibility

Categories

Upload Details

Uploaded via as Microsoft PowerPoint

Usage Rights

© All Rights Reserved

Report content

Flagged as inappropriate Flag as inappropriate
Flag as inappropriate

Select your reason for flagging this presentation as inappropriate.

Cancel
  • Full Name Full Name Comment goes here.
    Are you sure you want to
    Your message goes here
    Processing…
  • Molto interessante
    Are you sure you want to
    Your message goes here
    Processing…
Post Comment
Edit your comment

Introduction Dax Introduction Dax Presentation Transcript

  • 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