Forum Discussion

stack23's avatar
stack23
Icon for Advocate II rankAdvocate II
7 years ago
Solved

Slicer on SQL table with Begin and End Date

I have a customer table that contains:

 

  1. CustomerId
  2. StartDate
  3. EndDate (Blank willl be active)

I would like to create a slicer that can list all customers that were active between two dates. I want to conduct this efficiently Without enumerating. This example only uses enumeration: 

https://community.powerbi.com/t5/Desktop/Active-Employee-slicer-based-on-Start-and-End-date/td-p/350933

 

  • Hey,

     

    basically this is not as simple as it should be / could be, this is due to the following

    • currently it's not possible to add a measure to the Visual level filter of the default slicer
    • currently it's not possible to add a measure to page or report level filter

    Nevertheless my solution needs an additional table with date values, this table is not related to any date column of the customer table. This table is used to select a date range, e.g. by using the date slicer.

     

    Then I created a measure that returns the value 1 if the customer can be considered during the selected time period:

    Check Active Customer = 
    var minDate = MINX(ALLSELECTED('Calendar'[Date]),'Calendar'[Date])
    var maxDate = MAXX(ALLSELECTED('Calendar'[Date]),'Calendar'[Date])
    return
    SUMX(
        'Customer'
        ,
        var custStartdate = 'Customer'[Startdate]
        var custEnddate = 'Customer'[Enddate]
        return
        IF(
            AND(custEnddate >= minDate, custStartdate <= maxDate)
            ,1
            ,BLANK()
        )
    )

    Here is a screenshot of a little report I created:

     

    I'm using 

    • Default Slicer (does show all Customer)
    • Attribute Slicer (here the measure is usde on the as value)
    • A bar chart

    Personally my favorite solution is the "simple" bar chart, because here i can use the measure inside the visual level filter, this means I can use addtional measures to "provide" additional information about the customer.

     

    The Disadvantage using a bar chart that the user of the report has to be accustomed to use the CTRL Key, if cross filtering has 

    to be used.

     

    On the other hand "formatting" of the Attribute Slicer becomes more complex.

     

    Hopefully this gets you started,

     

    Regards,

    Tom

     

6 Replies

  • Hey,

     

    basically this is not as simple as it should be / could be, this is due to the following

    • currently it's not possible to add a measure to the Visual level filter of the default slicer
    • currently it's not possible to add a measure to page or report level filter

    Nevertheless my solution needs an additional table with date values, this table is not related to any date column of the customer table. This table is used to select a date range, e.g. by using the date slicer.

     

    Then I created a measure that returns the value 1 if the customer can be considered during the selected time period:

    Check Active Customer = 
    var minDate = MINX(ALLSELECTED('Calendar'[Date]),'Calendar'[Date])
    var maxDate = MAXX(ALLSELECTED('Calendar'[Date]),'Calendar'[Date])
    return
    SUMX(
        'Customer'
        ,
        var custStartdate = 'Customer'[Startdate]
        var custEnddate = 'Customer'[Enddate]
        return
        IF(
            AND(custEnddate >= minDate, custStartdate <= maxDate)
            ,1
            ,BLANK()
        )
    )

    Here is a screenshot of a little report I created:

     

    I'm using 

    • Default Slicer (does show all Customer)
    • Attribute Slicer (here the measure is usde on the as value)
    • A bar chart

    Personally my favorite solution is the "simple" bar chart, because here i can use the measure inside the visual level filter, this means I can use addtional measures to "provide" additional information about the customer.

     

    The Disadvantage using a bar chart that the user of the report has to be accustomed to use the CTRL Key, if cross filtering has 

    to be used.

     

    On the other hand "formatting" of the Attribute Slicer becomes more complex.

     

    Hopefully this gets you started,

     

    Regards,

    Tom

     

    • stack23's avatar
      stack23
      Icon for Advocate II rankAdvocate II

      this is wonderful,

      I should have reclarified my question,  user places one date, and check if that date is between CustomerBegindate and CustomerEndate

       

      example, report user selects: 3/5/2018

      it will pickup anything between begindate <= 3/5/2018 <= enddate,

      I assume this will work also?

       

      Check Active Customer = 
      var SelectDate = MINX(ALLSELECTED('Calendar'[Date]),'Calendar'[Date])
      return
      SUMX(
          'Customer'
          ,
          var custStartdate = 'Customer'[Startdate]
          var custEnddate = 'Customer'[Enddate]
          return
          IF(
              AND(custEnddate >= SelectDate, custStartdate <= SelectDate)
              ,1
              ,BLANK()
          )
      )

       

      • TomMartens's avatar
        TomMartens
        Icon for Super User rankSuper User

        Sure,

         

        please do not forget to mark my / your post as answer, it will help others.

         

        Regards,

        Tom