Skip to main content

Generate Calendar Table in Power BI with Fiscal Year Attributes

In Power BI go to
Get Data --> Blank Query
and paste into the Function windows the text below.

This function takes as parameters:
- StartYear (e.g., 2012)
- EndYear (e.g., 2018)
-FiscalYearStartMonth (e.g., 4)

And it will generate a calendar table for dates from Jan-1-<StartYear> till Dec-31-<EndYear> and columns for Fiscal Year, Fiscal Month, Fiscal Quarter, Fiscal Year Day where the Fiscal year begins on FiscalYearStartMonth


= (StartYear as number, EndYear as number, FiscalYearStartMonth as number)=>
let
    //Capture the date range from the parameters
    StartDate = #date(StartYear, 1, 1),
    EndDate = #date(EndYear, 12, 31),
//Get the number of dates that will be required for the table
    GetDateCount = Duration.Days(EndDate - StartDate)+1,
//Take the count of dates and turn it into a list of dates
    GetDateList = List.Dates(StartDate, GetDateCount,
    #duration(1,0,0,0)),
//Convert the list into a table
    DateListToTable = Table.TransformColumnTypes(Table.FromList(GetDateList, Splitter.SplitByNothing(), {"Date"}, null, ExtraValues.Error),{{"Date", type date}}),
//Create various date attributes from the date column
    //Add Year Column
    YearNumber = Table.AddColumn(DateListToTable, "Year",
    each Date.Year([Date]), Int64.Type),
//Add Quarter Column
    QuarterNumber = Table.AddColumn(YearNumber , "Quarter",
    each "Q" & Number.ToText(Date.QuarterOfYear([Date]))),
//Add Week Number Column
    WeekNumber= Table.AddColumn(QuarterNumber , "Week",
    each Date.WeekOfYear([Date]), Int64.Type),
//Add Month Number Column
    MonthNumber = Table.AddColumn(WeekNumber, "Month",
    each Date.Month([Date]), Int64.Type),
//Add Month Name Column
    MonthName = Table.AddColumn(MonthNumber , "Month Name",
    each Date.ToText([Date],"MMMM")),
//Add Year Day Number Column
    YearDayNumber= Table.AddColumn(MonthName , "Year Day",
    each Date.DayOfYear([Date]), Int64.Type),
//Add Week Day Number Column
    WeekDayNumber= Table.AddColumn(YearDayNumber , "Week Day",
    each Date.DayOfWeek([Date]), Int64.Type),
//Add Is Week Day Number Column
    IsWeekDay= Table.AddColumn(WeekDayNumber , "Is Weekday",
    each if (Date.DayOfWeek([Date])=0 or  Date.DayOfWeek([Date])=6) then 0 else 1, type number),
//Add Day of Week Column
    DayOfWeek = Table.AddColumn(IsWeekDay , "Day of Week",
    each Date.ToText([Date],"dddd")),
//Add Fiscal Month Column
    FiscalMonthNumber = Table.AddColumn(DayOfWeek , "Fiscal Month",
    each if [Month]>=FiscalYearStartMonth then [Month]-FiscalYearStartMonth+1 else [Month]-FiscalYearStartMonth+13, Int64.Type),
//Add Fiscal Quarter Column
    FiscalQuarterNumber = Table.AddColumn(FiscalMonthNumber , "Fiscal Quarter",
    each "FY Q" & Number.ToText(Number.RoundDown(([Fiscal Month]+2) / 3,0))),
//Add Fiscal Year Column
    Fiscalyear = Table.AddColumn(FiscalQuarterNumber , "Fiscal Year",
    each if [Month]>=FiscalYearStartMonth then [Year]+1 else [Year], Int64.Type),

//Add Fiscal Year Day Number Column
    FiscalYearDayNumber= Table.AddColumn(Fiscalyear , "Fiscal Year Day",
    each if [Month]>=FiscalYearStartMonth
    then ([Year Day] - Date.DayOfYear(#date([Year], FiscalYearStartMonth, 1)) + 1)
    else  if Date.IsLeapYear(#date([Year]-1,1,1))
          then 367 + [Year Day]- Date.DayOfYear(#date([Year]-1, FiscalYearStartMonth, 1))
    else 366 + [Year Day]- Date.DayOfYear(#date([Year]-1, FiscalYearStartMonth, 1))
   
    ,Int64.Type)



in    FiscalYearDayNumber

Comments

Post a Comment

Popular posts from this blog

SQL 2014 performance - Local disk vs. Azure Blob vs. Azure VM attached disk

Today I decided to compare SQL 2014 (RTM) performance when running a test against  - a local database (created on  WD7500BPKT - 750 GB 7200 RPM)  - a DB created on a disk attached to the A3 (3 cores, 7 GB) VM in Azure - a DB created on an Azure blob The VM in Azure was created in the US East region using the SQL 2014 template from the gallary provided by Microsoft. All databases were created with a single 10 GB data file (10 GB) and 1GB  log file. On the local SQL instance the DB was created as CREATE DATABASE TestDBonLocal ON     (NAME = file_data1, FILENAME = 'C:\TEMP\filedata1.mdf', SIZE = 10GB, FILEGROWTH = 256 MB )  LOG ON  (NAME = file_log1, FILENAME = 'C:\TEMP\filelog1.ldf', SIZE = 1GB, FILEGROWTH = 32 MB)  On the Azure VM the database on the attached disk (the disk was mapped as drive F:) was created as such CREATE DATABASE TestDBonDisk ON     (NAME = file_data1, FILENAME = 'F:\TMP\filedat...

Create 3-Node Windows 2012 Multi-subnet Cluster

Environment There are two Data centers connected via a WAN link. Two Windows 2012 Servers (called SQLDEV1 and SQLDEV2) are located in the Primary Data Center (on the IP subnet 192.168.79.0/24) and the third server is placed in the Secondary Data Center with the 192.168.69.0/24 subnet. We’ll be creating a three-node Windows cluster with no shared storage on the multi subnet network with a file share witness at the Primary Data Center. We’ll be using a file share witness to protect from the cluster failure in a situation when the network between the Data Centers is unavailable and one of the servers in the Primary Data Center is also down (or being rebooted). The final state will look like depicted above: -           Two Virtual IP’s will be assigned (192.168.76.218 and 192.168.69.134) to the cluster -           The servers at the Primary Data Center will have a vote (Vote=1) and the ...

SQL 2012 AlwaysOn: Synchronous vs. Asynchronous commit. Performance impact

Recently I've had a chance to build a 3-server AlwaysOn environment distributed between the primary and secondary data centers. The configuration looks like this: Primary Data Center                         Secondary Data Center                        SQLDEV1                                        SQLDEV3          SQLDEV2 The availability group was crated with synchronous commit replicas on SQLDEV1 and SQLDEV2 and the replica on SQLDEV3 was configured for asynchronous commit. The link between the data centers was not great and when I pinged SQLDEV3 from SQLDEV1 I got these results Approximate round trip times in milli-seconds:     Minimum = 39ms, Maximum = 63ms, Average = 42ms I also created a very simp...