Twitter Updates

    follow me on Twitter

    Monday, June 24, 2013

    PowerPivot Nuggets - Part 20 - Create Time Dimension Office App

    Over the last few years I have created many PowerPivot models and almost every single one of them had a calendar dimension.   One of the top items on my "personal PowerPivot feature wish list" is a Calendar Dimension  Wizard. It would be great to have a Calendar Dimension wizard  where you can just generate a calendar table:

    • From Date x until date y
    • Choose attributes Month, MonthName, Year, Week, Fiscal Year, …
    • Fiscal Year starts at xxx
    • Create hierarchy on x,y,z, …
    • Create common date calculations (YTD, YOY, Y-1, …)
    • ...

    Recently I ran into an App for Excel 2013 which does a large part of this work.  The App is called Create Time Dimension and is written by Stefan Johansson.

    After you installed this free App from the Office App Store you can generate a Calendar dimension in a few seconds.  

    In the latest release the calendar can be generated in Dutch (next to English and Swedish).

    A real time saver!


    Friday, July 20, 2012

    PowerPivot Nuggets - Part 19 - Automate PowerPivot Refresh with Excel 2013

    Earlier this week Microsoft released the Office 2013 Customer Preview.  PowerPivot and Power View are now first class citizens in Excel, how cool is that.  I will blog about the BI features of Excel 2013 in the future.

    But today I want to share a nice long awaited feature for PowerPivot: Automate the refresh of the PowerPivot model.

    Excel 2013 now contains a Workbook.Model class that can be accessed via VBA code.  The following line of code will refresh your PowerPivot Model.

    Me.Model.Refresh

    If you want to automatically refresh the PowerPivot model when the workbook is opened, simply follow the following 2 steps.

    • Press ALT-F11 to open the Vusual Basic editor and then paste the following lines of code in the Code window for ThisWorkbook

      Private Sub Workbook_Open()
          If MsgBox("Do you want to refresh the PowerPivot Model?", vbYesNo) = vbYes Then
              Me.Model.Refresh
          End If
      End Sub
    •  Save the workbook as an Excel Macro Enabled Workbook (.XLSM)

     Next time you open the Excel file you will be prompted with the question "Do you want to refresh the PowerPivot Model".  Choose Yes, and Excel will automatically refresh the PowerPivot Model and all the Pivottables in the workbook.

    How cool!!!

    Tuesday, July 10, 2012

    PowerPivot Nuggets - Part 18 - SWITCH() and multiple expressions

    SWITCH() is a new function introduced in PowerPivot v2.  SWITCH() is a great alternative for nested IF() functions in DAX.  Let's have look at a very simple example.

    Let's say I want to categorise scores, 1 to 5 would become a C, 5 to 8 becomes a B and everything above 8 is an A.

    In PowerPivot v1 we could write this with nested IFs as follows:

    =IF([Score] >=1 && [Score] <5; "C";
              IF([Score] >= 5 && [Score] < 8; "B";
                     IF ([Score] >=8 && [Score] <=10; "A";
        "Wrong Value"
    )))


    I could write this shorter and more elegant but I want to show you that you can evaluate different independent expressions for each IF statement.  I really hate nested IFs.  I have seen DAX calculations with more than 30 nested IFs and trust me they are hard to debug.

    So, enter SWITCH().

    At first I was a little disappointed when I saw the syntax for the SWITCH() functions.

    SWITCH(expression, value, result[, value, result] ... [, else])

    It looks like you can only have one expression that returns a single scalar value, where the expression is to be evaluated multiple times (for each row/context).

    This means that in our example the calculation would look something like

    =SWITCH([Score];
    1;"C";
    2;"C";
    3;"C";
    4;"C";
    5;"B";
    6;"B";
    7;"B";
    8;"A";
    9;"A";
    10;"A";
    "Wrong Value"
    )


    Easy to read, but not really a time saver.  I was hoping I could write something like this:

    =SWITCH(
    [Score] >=1 && [Score] <5; "C";
    [Score] >= 5 && [Score] < 8; "B";
    [Score] >=8 && [Score] <=10; "A";
    "Wrong Value"
    )


    The expression above will raise an error.  However, recently I ran into a trick.  If you just pass TRUE() as the first argument you can actually evaluate different independent expressions.  This results in the following expression.
    =SWITCH(TRUE();
    [Score] >=1 && [Score] <5; "C";
    [Score] >= 5 && [Score] < 8; "B";
    [Score] >=8 && [Score] <=10; "A";
    "Wrong Value"
    )


    So SWITCH(TRUE();expression1; value1; expression2; value2; expression3; value3; .... ElseValue)  is the trick for rewriting nested IFs in DAX.

    Friday, March 30, 2012

    PowerPivot Nuggets - Part 17 - Visualize KPI Trends

    KPIs are a nice new feature in PowerPivot 2012.  I blogged about KPIs before.    In PowerPivot KPIs have a value, a target and a status.  Compared to KPIs in full blown Analysis Services OLAP cubes we are missing the possibility to visualize the trend of the KPI.

    In this nugget I will show you a trick how you can visualize the trend of a KPI.  Let's have a look at this example.
    First of all we need to find the value of the Margin KPI for the previous quarter.  This pretty straightforward with the following calculated measure using the CALCULATE function:

    CALCULATE(SalesAndCosts[Margin],PREVIOUSQUARTER(Calendar[Date]))

    We calculate the margin, and change the filter context to the previous quarter.

    Next we can check if this value is lower than the margin for the current month.  If this is the case we return 1, otherwise we return -1.

    IF(CALCULATE(SalesAndCosts[Margin],PREVIOUSQUARTER(Calendar[Date])) < SalesAndCosts[Margin]
    , 1,
    -1)

    This will result in the following pivot table with 1s and -1s.


    By using conditional  formatting we can make the table visually more attractive.  Choose Conditional Formatting from the Home ribbon, Icon Sets, 3 arrows.


    Next, choose Conditional Formatting  again, click Manage Rule, Edit Rules and change the following parameters:
    • Check the checkbox Show Icon Only.
    • Green when value  is > 0 (Number)
    • Amber when <0= and >= 0 (Number)
    • Red when < 0


    This the final result.


    This workaround works pretty fine, disadvantage is the fact that the icon style is not saved with the KPI.  You need to repeat the conditional formatting on every new pivot table.

    Thursday, February 09, 2012

    PowerPivot Nuggets - Part 16 - Berekening Voordeel Alle Aard (VAA) Bedrijfswagens

    In Belgium there is a lot of buzz going around the higher taxes on company cars.  In Dutch it's called "Voordeel Alle Aard".  The goverment changed the way this tax is calculated.  Everybody with a company car in Belgium is now trying to find out wether he will pay more or less taxes.  Although we know the answer in advance :-)

    Time to put this into a PowerPivot workbook.  The workbook uses the concepts I described in my previous blogpost PowerPivot Nuggets - Part 15 - What If Analysis with Slicers.

    The tax used to be calculated on two parameters: CO2 emissions of your car and the distance between your house and your workplace.

    In DAX the formula looks like this:

    IF(HASONEVALUE(CO2) && HASONEVALUE(CatalogusPrijs) && HASONEVALUE(ForfaitAfstand) &&HASONEVALUE(Leeftijd)

    ;VALUES(CO2[CO2 Uitstoot])*0,00237 * VALUES(ForfaitAfstand[ForfaitAfstand 2011])
    ;BLANK())

    The new formula is more complex.  CO2 emissions, age and the list price of the car play a role. In DAX it looks something likes this:

    IF(HASONEVALUE(CO2) && HASONEVALUE(CatalogusPrijs) && HASONEVALUE(ForfaitAfstand) &&HASONEVALUE(Leeftijd)
    ;
       (( VALUES(CatalogusPrijs[CatalogusPrijs])
       * (((( VALUES(CO2[CO2 Uitstoot])-95)*0,1)+5,5)/100))*0,857143)
       * VALUES(Leeftijd[Pct])
    ;BLANK())

    Since the "Voordeel Alle Aard" is minimum 1200 EUR/year I need to write a wrapper around this calculation.

     Jaarlijkse Bijdrage Nieuw:=IF(Bijdrage[Jaarlijkse Bijdrage Nieuw Hidden] < 1200;1200; Bijdrage[Jaarlijkse Bijdrage Nieuw Hidden])

    Final step is to create a workbook with 3 slicers (Home-Work Distance, List-Price of the Car and CO2 Emission).  By choosing the right values for your car the workbook will calculate the old and new "Voordeel Alle Aard" and the difference between the two.


    You can download the workbook here. You need at least Microsoft SQL Server 2012 PowerPivot for Microsoft Excel 2010 RC0.


    THIS WORKBOOK IS DISTRIBUTED IN THE HOPE THAT IT WILL BE USEFUL FOR POWERPIVOT DEMO PURPOSE, BUT WITHOUT ANY WARRANTY. IT IS PROVIDED "AS IS" WITHOUT WARRANTY OF ANY KIND, EITHER EXPRESSED OR IMPLIED.

    PowerPivot Nuggets - Part 15 - What If Analysis with Slicers

    Relationships are one of the cornerstones of PowerPivot.  In general every PowerPivot workbook should have relationships defined in the model.  However I found some very nice use cases where it makes sense not to define any relationships.

    Let's take a look at this little example. Suppose we have a table with articles, cost prices and sales prices.


    I want to see what happens with my margin (Sales Price - Cost Price) when I start giving discounts.   I create a second Discount table with possible discounts.  I can't create a relationship between the two tables because they don't have any columns in common.


    I place the discounts on a slicers and now I  need to find the "selected discount".  Since there's no relationship between the tables the built-in filter concepts of PowerPivot don't apply here.

    The DAX VALUES() function is my rescue.  VALUES() returns a one-column table that contains the distinct values from the specified column.  It doesn't make sense to calculate the discounted sales price when more than one discount is selected .  So I need to write a little wrapper around the VALUES() function to return BLANK() if more than one values is selected.



    SelectedDiscount := 
               IF(HASONEVALUE(Discount[Discount])=1;
                          VALUES(Discount[Discount])
                         ;BLANK())


    Now calculating the discounted value is very simple: SUM(Article[SalesPrice])*(1-VALUES(Discount[Discount]))


    DiscountedPrice :=
               IF(HASONEVALUE(Discount[Discount]);
                          SUM(Article[SalesPrice])*(1-VALUES(Discount[Discount]))
                          ;BLANK())

    And similar for the margin after discount in percentage:

    MarginAfterDiscount:= 
                          IF(HASONEVALUE(Discount[Discount]);
                          (Article[DiscountedPrice]-SUM(Article[CostPrice]))/SUM(Article[CostPrice])
                          ;BLANK())

    Now by simply clicking on the discount slicer I can see the effect of the discounts on my margin.





    Wednesday, February 01, 2012

    PowerPivot Nuggets - Part 14 - Generate a list with all your DAX calculations

    As your PowerPivot workbooks grow larger and contain more calculation the urge for some kind of documentation becomes stronger.  In this PowerPivot Nugget I will describe a simple way to generate a list with all your DAX calculations.

    The technique uses the internal dynamic management views of Power Pivot.  The dynamic management views are internal objects in PowerPivot that hold a lot of useful information about your PowerPivot model.  In his blogpost Querying PowerPivot DMVs from Excel Chris Webb describes step by step how to use them.

    I will show you a shortcut that only takes a few mouse clicks.

     Step 1 - The preparation - Create an .ODC file with the connection and query to the embedded PowerPivot model

    Option 1
    • Download the connection file from Skydrive "PowerPivot Get All DAX statements.odc"
    • Make sure you have the extension .odc correct
    • Save it in an easy to remember location (e.g. My Data Sources).
    Option 2
    Create the ODC file from scratch as described in the blogpost by Chris.  There are 2 important parts in the connection file you need the change.

    The connection string to the internal PowerPivot model:

    Provider=MSOLAP.5;Persist Security Info=True;Initial Catalog=Microsoft_SQLServer_AnalysisServices;
    Data Source=$Embedded$;MDX Compatibility=1;Safety Options=2;ConnectTo=11.0;MDX Missing Member Mode=Error;
    Optimize Response=3;Cell Error Mode=TextValue

    and the query to retrieve the DAX expressions:

    SELECT DISTINCT [TABLE],  OBJECT_TYPE, OBJECT,    EXPRESSION
    FROM $system.discover_calc_dependency 
    WHERE OBJECT_TYPE = 'MEASURE' 
    OR OBJECT_TYPE  = 'CALC_COLUMN'
    ORDER BY 1


    Step 2 - Generate the DAX documentation

    Open a PowerPivot workbook and create a new blank sheet.
    In the Data ribbon, choose Get External Data, Existing Connections.


    Browse to the "PowerPivot Get All DAX statements.odc " file you created in Step 1.


     Click OK and this is the result



    In the future Excel will remember the connection to the ODC file and it will only take you 3 mouse clicks to get an updated list of all your DAX calculations.
        1) Get External Data
        2) Double click on  PowerPivot Get All DAX statements in the Existing Connections dialogue box.




    A real time saver!!



    Wednesday, December 07, 2011

    PowerPivot Nuggets - Part 13 - Save PowerPivot workbook as Analysis Services Cube

    Consider the following scenario's:

    • A business person created a PowerPivot workbook, but is struggling with some more advanced DAX.
    • A BI consultant created a protype of a cube in PowerPivot
    • A PowerPivot workbook becomes very popular and needs to be rolled out at the enterprise level.  We need to add security, partions, perspecitves ...

    Wouldn't it be nice if we had an option like "File - Save As Analysis Services Cube".

    Well, the title of this nugget is a little misleading.  You won't find "File - Save As Analysis Services Cube" in PowerPivot for Excel.  However there are  "Import from PowerPivot" possibilities.

    First one is in Visual Studio (SQL Data Tools).  Choose, File, New Project, Analysis Services.  And there you have an option to import a PowerPivot workbook.

    Second option is via SQL Server Management Studio.  Connect to a SSAS instance running in tabular mode and Choose "Restore From PowerPivot" from the object explorer.



    Personally I think this is one of the killer features of PowerPivot in SQL Server 2012.  The possibility to easily "upgrade" and enchance an existing PowerPivot workbook and turn it into a full blown Analysis Services cube will dramatically change the we way how we develop and implement BI projects in the future.


    Friday, November 25, 2011

    PowerPivot Nuggets - Part 12 - The Measure Grid

    In PowerPivot v1 calculated columns were created in the PowerPivot window and calculated measures were created in the PowerPivot Field list interface in Excel. In v2 you can now also create calculated measures in the PowerPivot window by using the new measure grid.



    You cannot only create measures in the measure grid, but PowerPivot will actually calculate the measure. Another cool thing is the fact that the measure is recalculated when you start filtering the table, as you can see in the screenshot below (filtered on Clothing).

    Monday, November 21, 2011

    PowerPivot Nuggets - Part 11 - Add Values to Rows and Columns

    While reviewing the session scores of SQL Server Days I ran into a very nice new feature in PowerPivot v2. You can now add values to rows and columns. This allows you to do some very nice analysis very fast.

    I just wanted so know how many sessions scored a 10, and how many scored a 9, .....

    By simply dragging the score value to the rows area I got the following results.

    Friday, August 12, 2011

    PowerPivot Nuggets - Part 10 - KPIs

    KPIs are another Analysis Services concept coming to PowerPivot. Creating KPIs is pretty straight forward.

    In the example below I have table with Sales and Costs. Let's say we want to have a 5% margin.

    KPIs in PowerPivot are based on a meusure. So, first thing to do is create a measure to calculate the margin.


    Step 2 is setting the KPI target values. Target values can again be based on a measure or as in this simple example on a fixed value.


    Step 3 is setting the tresholds and finally we choose an icon style.

    And that's it, our KPI is ready to use!

    Thursday, August 11, 2011

    PowerPivot Nuggets - Part 9 - Descriptions

    After the long PowerPivot Nugget on Parent Child relations a very short nugget today.

    PowerPivot v2 allows you to add descriptions to various objects. Explore the user interface and you will discover that you can add descriptions on Tables, Columns, Calculated measures, KPIs, ....

    A nice little new feature that will make your models easier to understand for other users.

    Tuesday, August 09, 2011

    PowerPivot Nuggets - Part 8 - Parent Child Relations

    Parent Child hierarchies like organization hierarchies and account structures are very common in reporting environments. PowerPivot V2 ships with a set of new DAX functions which allows us to leverage this in PowerPivot.

    Let's have a look at our dimEmployee table. This table has a parent-child relations (ParentEmployeeKey --> EmployeeKey). As you can see in the screenshot below; you cannot create a relationship between the two columns in PowerPivot. Just like with roll-playing dimensions PowerPivot uses a different approach than Analysis Services.



    In PowerPivot Parent Child relatinships are managed through DAX. Let's focus on employee John Campbell and play around with some DAX functions.



    First function is PATH. PATH returns a delimited text string with the EmployeeKey of all the parents of the current EmployeeKey, starting with the earliest and continuing until the current.

    =PATH([EmployeeKey],[ParentEmployeeKey])

    John Campbell's manager is Peter Krebs, and Peter Kreb's manager is Ken Sánchez. If we look at the corresponding Employekeys this results in 112|23|20.



    Second function is PATHLENGTH(). PATHLENGTH(PATH([EmployeeKey],[ParentEmployeeKey])) will return the length of the path. In John Campbell's case this is 3.



    With PATHCONTAINS() we can check if a particular key exists in the path.

    =PATHCONTAINS(PATH([EmployeeKey],[ParentEmployeeKey]),23) will return TRUE if EmployeeKey 23 is found anyware in the levels above the current Employee. In the case of John Campbell this will return TRUE.

    PATHITEM AND PATHITEMREVERSE allows us to pick out a particular level in the hierarchy.



    PATHITEM(PATH([EmployeeKey],[ParentEmployeeKey]),2) will return the 2nd level in the hierarchy starting from the top. PATHITEMREVERSE(PATH([EmployeeKey],[ParentEmployeeKey]),2) will return the 2nd level in the hierarchy starting from the bottom.

    In the case of John Campbell this is two times 23.

    The last function we need to peek at is LOOKUPVALUE which allows us to lookup a particular column value for a given search criteria. The following DAX statement will return the manager's name.

    =LOOKUPVALUE([EmployeeName],[EmployeeKey],PATHITEMREVERSE(PATH([EmployeeKey],[ParentEmployeeKey]),2))

    For John Campbell this is Peter Krebs.



    If we now combine LOOKUPVALUE, PATH, and PATHITEM we can turn this parent-child dimensions into a natural hierarchy by creating a column for each level:

    =LOOKUPVALUE([EmployeeName],[EmployeeKey],PATHITEM(PATH([EmployeeKey],[ParentEmployeeKey]),1))
    =LOOKUPVALUE([EmployeeName],[EmployeeKey],PATHITEM(PATH([EmployeeKey],[ParentEmployeeKey]),2))



    This approach is very similar to the concept used by BIDSHelper's Parent-Child Dimension Naturalizer for Analysis Services.

    Next step is to create a hierarchy in the diagram view and create a pivottable.


    This nugget was written on CTP3. One thing that is missing here is an easy way to hide the "empty levels". E.g. Peter Krebs is on level 2, so level 3, 4, 5, .. are empty for Peter Krebs.
    In Analysis Services we solve this by setting the HideMemberIf property. Alberto Ferrari blogged a workaround for this in his post on Parent Child relationships. Alberto also opened an item on Microsoft Connect. Let's vote for this feature request and hope it makes it in the RTM version.

    The longest nugget so far on a very cool BI concept coming to PowerPivot.


    Monday, August 08, 2011

    PowerPivot Nuggets - Part 7 - Multiple Relationships

    Let's dive a little deeper into relationships today. In PowerPivot V1 we could only create one relationship between two tables. Good news coming to V2. We can now create multiple relationships between tables.

    Let's have a look at our factInternetSales table. The table has OrderDateKey, DueDateKey and ShipDateKey. All three link to the DimDate table. As you can see in the screenshot below we can create a relationship for each one of them. However, only 1 of them can be the "active relationship". And that is the key-concept to understand in V2.



    When you create a pivot table, PowerPivot will use the active relationship (on OrderDateKey). If you want see the Sales per DueDate or ShipDate you must create a DAX calculation and use the new USERELATIONSHIP function. This function will force PowerPivot to use a "non-active" relationships.

    CALCULATE(SUM(FactInternetSales[SalesAmount]),USERELATIONSHIP(FactInternetSales[ShipDateKey], DimTime[TimeKey]))



    This support for multiple relationships is a very nice addition to PowerPivot. But, personally I think Analysis Services' concept of roll-playing dimensions is more "user-friendly" than PowerPivot's concept of active relationships and USERELATIONSHIP.

    Wednesday, August 03, 2011

    PowerPivot Nuggets - Part 6 - Sort By Column

    In PowerPivot V1 members in a slicer are sorted in alphabetic order by default. This is fine for product descriptions or customer names. But not for months or weekdays.



    The workaround in v1 was to add a number before the weekday as you can see on the right hand slicer in the above screenshot. It works, but it is - let's say' - a little ugly.

    In PowerPivot V2 we can specify a "Sort By Column".


    And this is the result:

    A small but nice enhancement.

    Tuesday, August 02, 2011

    PowerPivot Nuggets - Part 5 - Mark As Date Table

    PowerPivot is bulk loaded with Time Intelligence functions. Those functions make it very easy to do data calculations like Y-1, YTD, MTD, .... In V1 however, you needed to follow the golden rules as discussed in this blogpost by Kasper de Jonge. If you didn't, you ended with wrong results in DAX calculations.

    In a typical business scenario for PowerPivot we combine data coming from a relational datawarehouse with other data sources. One of the best practices when building relational datawarehouses is the use of surrogate integer keys. The primary key of our date dimension will be a integer column as well as the foreign keys in the fact table).

    This breaks of course rule 5. Make sure that relationships are based on a datetime column (and NOT based on another artificial key column).


    In V2 we no longer need to workaround this issue. We can mark a table as a Date Table. Once we do this time intelligence functions will work out fine, even if the relationship between the fact table and time dimensions is based on an integer colum.

    In the screenshot below you can see how a simple YTD calculation is wrong simply because the relationship between the two tables is based on an integer column.

    After marking DimTime as Date Table the calculations run just fine.


    In the mean time Kasper has blogged new Golden rules for PowerPivot V2.

    1. Never use the datetime column from the fact table in time functions.

    2. Always create a separate Date table.

    3. Make sure your date table has a continues date range

    4. Create relationships between fact tables and the Date table.

    5. The datetime column in the Date table should be at day granularity (without fractions of a day).

    6. Mark the Date table as a Date Table in PowerPivot and set the Date column.

    Monday, August 01, 2011

    PowerPivot Nuggets - Part 4 - Perspectives

    Perspectives, like drill-through, are another Analysis Services feature coming to PowerPivot.

    Perspectives allow you to expose a subset of your model to the end users. Let's say you created a PowerPivot model on Sales, Purchase and Inventory with 15 dimensions, each with about 10 attributes and a total of +50 measures. This model can be a little bit overwhelming for e.g. the Sales Manger.

    We can now create a perspectives that contains only the most important attributes and measures related to Sales and expose that to the Sales Manager.

    Before you can create perspectives, you must switch to PowerPivot in advanced mode.

    Next you choose Perspectives in the Advanced tab, and start creating your perspectives.

    In the Pivot table view in Excel you can choose the perspective from the top drop down-box in the PowerPivot Field List.

    Another nice Analysis Services (Enterprise!!) feature coming to PowerPivot.

    Friday, July 29, 2011

    PowerPivot Nuggets - Part 3 - Drill-through

    Analysis Services, PowerPivot's older and bigger brother, has had drill-through functionality for quite some time now. Basically this feature allows you to drill-through a cube and go to the underlying datasoure and fetch the detail rows.

    This feature is now coming to PowerPivot. Right click on a measure and choose "Show Details". Or simply double-click on a measure.

    Excel will open up a new sheet and fetch (by default the first 1000 rows) of the underlying table.


    You can change the number of rows to fetch in the connection properties of your PowerPivot Data Connection.

    A nice new feature that will make data analysis a lot easier.

    Thursday, July 28, 2011

    PowerPivot Nuggets - Part 2 - Hierarchies

    About two years ago I opened the following item on Microsoft Connect.

    "Dimension Hierarchies (eg. Category - SubCategory - Product) are a key element for making cube concepts easier to understand and use for a lot of business people.

    I didn't find a way to create hierarchies in the current CTP of Gemini. I hope this will make it in future CTPs and the final relase."

    Hierarchies didn't make in PowerPivot V1 but they are here now on V2.

    As highlighted in Nugget 1, hierarchies are created in the Diagram View.







    Once created you can use them in your pivot table in the row and colum areas. Another cool thing is that you can also drag a hierarchy to the vertical or horizontal slicer areas. Excel will automatically create a slicer for every level in the hierarchy.





    Cool stuff!