Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Power BI is turning 10! Let’s celebrate together with dataviz contests, interactive sessions, and giveaways. Register now.

Reply
EllieSiroco1
New Member

Error when calculating Returning Customers

Ihave a PowerBi table called "orders-web2019" with the following dimensions: "Order date", "customer email" , and the following metric "Sales inc VAT".

 

I have written DAX to define a new calculated column with the name "returning customers" that shows customers (based on the "customer email" dimension) who generated sales (based on 'orders-web2019'[Sales inc VAT] > 0) in the period between "01 November 2023 to 31 December 2023" (order date) and returned to generate sales again in the period between the order dates "01 November 2024 to 31 December 2024". The rest of the customers would be identified as "New".

I have encountered the following error "A function "placeholder" has been used in a True/False Expression as a table that is used as filter expression , This is not allowed"

for this snippet of DAX  - where is the mistake? Thank you for your help in advance

Returning Customers =
   VAR CurrentCustomerEmail = 'orders-web2019'[customer email]
   VAR CurrentOrderDate = 'orders-web2019'[Order date]
    VAR PreviousPeriodStart = DATE ( 2023, 11, 01 )
VAR PreviousPeriodEnd = DATE ( 2023, 12, 31 )
VAR CurrentPeriodStart = DATE ( 2024, 11, 01 )
VAR CurrentPeriodEnd = DATE ( 2024, 12, 31 )


VAR CustomerInPreviousPeriod =
CALCULATE (
COUNTROWS ( 'orders-web2019' ),
'orders-web2019'[customer email] = CurrentCustomerEmail,
'orders-web2019'[Order date] >= PreviousPeriodStart,
'orders-web2019'[Order date] <= PreviousPeriodEnd,
'orders-web2019'[Sales inc VAT] > 0
)


VAR CustomerInCurrentPeriod =
CALCULATE (
COUNTROWS ( 'orders-web2019' ),
'orders-web2019'[customer email] = CurrentCustomerEmail,
'orders-web2019'[Order date] >= CurrentPeriodStart,
'orders-web2019'[Order date] <= CurrentPeriodEnd,
'orders-web2019'[Sales inc VAT] > 0
)


RETURN
IF (
CustomerInPreviousPeriod > 0
&& CustomerInCurrentPeriod > 0,
"Returning",
"New"
)

2 ACCEPTED SOLUTIONS
Anonymous
Not applicable

Hi @EllieSiroco1 

 

Please try this:

Here I create a set of sample:

vzhengdxumsft_0-1736734004951.png

Then add a calculated column:

Returning Customers =
VAR CurrentPeriodStart =
    DATE ( 2024, 11, 01 )
VAR CurrentPeriodEnd =
    DATE ( 2024, 12, 31 )
VAR _previousSales2 =
    CALCULATE (
        SUM ( 'orders-web2019'[Sales inc VAT] ),
        FILTER (
            ALLSELECTED ( 'orders-web2019' ),
            'orders-web2019'[customer email] = EARLIER ( 'orders-web2019'[customer email] )
                && YEAR ( 'orders-web2019'[Order date] )
                    = YEAR ( EARLIER ( 'orders-web2019'[Order date] ) ) - 1
                && MONTH ( 'orders-web2019'[Order date] )
                    = MONTH ( EARLIER ( 'orders-web2019'[Order date] ) )
        )
    )
RETURN
    IF (
        'orders-web2019'[Order date] >= CurrentPeriodStart
            && 'orders-web2019'[Order date] <= CurrentPeriodEnd,
        IF (
            _previousSales2 > 0
                && 'orders-web2019'[Sales inc VAT] > 0,
            "Returning",
            "New"
        )
    )

The result is as follow:

vzhengdxumsft_1-1736734578427.png

 

Best Regards

Zhengdong Xu
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

 

View solution in original post

@EllieSiroco1 

Sorry I think I misunderstood you before.

I think this simply solution will do what you you want ...

 

Create 4 measures ... 

 

 

Has NovDec2023 sales = 
// create a temp file of dates in range 
VAR mydates =  FILTER('Calendar', 'Calendar'[Date] >= DATE(2023,11,01) && 'Calendar'[Date] <= DATE(2023,12,31))
RETURN
// return 1 if there were any sales within date range
CALCULATE(
INT(NOT(ISEMPTY(Sales))),
mydates
)

 

 

 

 

 

Has NovDec2024 sales = 
// create a temp file of dates in range 
VAR mydates =  FILTER('Calendar', 'Calendar'[Date] >= DATE(2024,11,01) && 'Calendar'[Date] <= DATE(2024,12,31))
RETURN
// return 1 if there were any sales within date range
CALCULATE(
INT(NOT(ISEMPTY(Sales))),
mydates
)

 

 

 

 

 

New customers = 
// create temp file of qualifiying customers  
var mysubset =
FILTER(VALUES(Sales[CustomerKey]), 
    [Has NovDec2023 sales] = 0 &&
    [Has NovDec2024 sales] = 1)
 RETURN
 // count the rows
 COUNTROWS(mysubset)  

 

 

 

 

 

Returning customer = 
// create temp file of qualifiying customers  
var mysubset =
FILTER(VALUES(Sales[CustomerKey]), 
    [Has NovDec2023 sales] = 1 &&
    [Has NovDec2024 sales] = 1)
 RETURN
 // count the rows
 COUNTROWS(mysubset)   

 

 

 

Please click the [accept solution] and thumbs up button. Thank you.

 

Click here to download PBIX example from Onedrive

Click here 

 

speedramps_0-1736784118589.png

 

 

 

 

View solution in original post

8 REPLIES 8
Anonymous
Not applicable

Hi @EllieSiroco1 

 

Please try this:

Here I create a set of sample:

vzhengdxumsft_0-1736734004951.png

Then add a calculated column:

Returning Customers =
VAR CurrentPeriodStart =
    DATE ( 2024, 11, 01 )
VAR CurrentPeriodEnd =
    DATE ( 2024, 12, 31 )
VAR _previousSales2 =
    CALCULATE (
        SUM ( 'orders-web2019'[Sales inc VAT] ),
        FILTER (
            ALLSELECTED ( 'orders-web2019' ),
            'orders-web2019'[customer email] = EARLIER ( 'orders-web2019'[customer email] )
                && YEAR ( 'orders-web2019'[Order date] )
                    = YEAR ( EARLIER ( 'orders-web2019'[Order date] ) ) - 1
                && MONTH ( 'orders-web2019'[Order date] )
                    = MONTH ( EARLIER ( 'orders-web2019'[Order date] ) )
        )
    )
RETURN
    IF (
        'orders-web2019'[Order date] >= CurrentPeriodStart
            && 'orders-web2019'[Order date] <= CurrentPeriodEnd,
        IF (
            _previousSales2 > 0
                && 'orders-web2019'[Sales inc VAT] > 0,
            "Returning",
            "New"
        )
    )

The result is as follow:

vzhengdxumsft_1-1736734578427.png

 

Best Regards

Zhengdong Xu
If this post helps, then please consider Accept it as the solution to help the other members find it more quickly.

 

thank you very much @Anonymous this works for me

Ashish_Mathur
Super User
Super User

Hi,

Share some data, explain the questionn and show the expected result.  Share data in a format that can be pasted in an MS Excel file.


Regards,
Ashish Mathur
http://www.ashishmathur.com
https://www.linkedin.com/in/excelenthusiasts/
EllieSiroco1
New Member

@speedramps thank you for the solution, I am not entirely sure how to adapt it , as i do not have a "minimum date". I am comparing two very specific periods:
between "01 November 2023 to 31 December 2023" (order date)  and the period between the order dates "01 November 2024 to 31 December 2024, rather than the period before a date in the entire calendar

@EllieSiroco1 

Sorry I think I misunderstood you before.

I think this simply solution will do what you you want ...

 

Create 4 measures ... 

 

 

Has NovDec2023 sales = 
// create a temp file of dates in range 
VAR mydates =  FILTER('Calendar', 'Calendar'[Date] >= DATE(2023,11,01) && 'Calendar'[Date] <= DATE(2023,12,31))
RETURN
// return 1 if there were any sales within date range
CALCULATE(
INT(NOT(ISEMPTY(Sales))),
mydates
)

 

 

 

 

 

Has NovDec2024 sales = 
// create a temp file of dates in range 
VAR mydates =  FILTER('Calendar', 'Calendar'[Date] >= DATE(2024,11,01) && 'Calendar'[Date] <= DATE(2024,12,31))
RETURN
// return 1 if there were any sales within date range
CALCULATE(
INT(NOT(ISEMPTY(Sales))),
mydates
)

 

 

 

 

 

New customers = 
// create temp file of qualifiying customers  
var mysubset =
FILTER(VALUES(Sales[CustomerKey]), 
    [Has NovDec2023 sales] = 0 &&
    [Has NovDec2024 sales] = 1)
 RETURN
 // count the rows
 COUNTROWS(mysubset)  

 

 

 

 

 

Returning customer = 
// create temp file of qualifiying customers  
var mysubset =
FILTER(VALUES(Sales[CustomerKey]), 
    [Has NovDec2023 sales] = 1 &&
    [Has NovDec2024 sales] = 1)
 RETURN
 // count the rows
 COUNTROWS(mysubset)   

 

 

 

Please click the [accept solution] and thumbs up button. Thank you.

 

Click here to download PBIX example from Onedrive

Click here 

 

speedramps_0-1736784118589.png

 

 

 

 

speedramps
Community Champion
Community Champion

Try these adapt these DAX measure instead of calculated columns.
DAX measures are much better than calculated columns because the user can pick and chose the duration

NO new customers = 
/* DOCUMENTATION
Get number of new customers as follows:-
Use addcolumns to get a set with (ResellerKey,Previous Rows)
Then filters the set to just to include customers Keys with no previous rows.
Then count the number of customers 
*/

VAR mindate =  MIN ( 'Calendar'[Date] ) 

VAR NewCustomers  = 
    FILTER (
        ADDCOLUMNS (
            VALUES ( Sales[CustomerKey] ),
            "PreviousRows", 
                CALCULATE (COUNTROWS (Sales),
                FILTER (ALL ( 'Calendar'[Date] ),'Calendar'[Date] < mindate))
        ),
        [PreviousRows] = 0
    )

RETURN
COUNTROWS(NewCustomers) 

 

NO returning customers = 
/* DOCUMENTATION *
Number of returning customers
*/
VAR mindate = MIN('Calendar'[Date])

RETURN
COUNTROWS (
    CALCULATETABLE (
        VALUES ( Sales[CustomerKey] ),
        VALUES ( Sales[CustomerKey] ),
        FILTER (
            ALL ( 'Calendar' ),
            'Calendar'[Date] < mindate 
        )
    )
)

 

I would be most grateful if you click the [accept solution] and thumbs up buttons.

Thank you 

@speedramps this is a different model (table) structure for me, and it uses measures instead of a calculated column, but i can see the logic behind it, and I have applied it with changes to fit my model. This is a different , alternative approach - thank you

Novices typicaly start out by using calculated columns (because they are like Excel).
We all star that way (I recall I did) but then we learn that measures are so much better and dynamic.

Please click [accept solution] and the thumbs up button for mine and other helpers solutions.

Thank you

Helpful resources

Announcements
Join our Fabric User Panel

Join our Fabric User Panel

This is your chance to engage directly with the engineering team behind Fabric and Power BI. Share your experiences and shape the future.

June 2025 Power BI Update Carousel

Power BI Monthly Update - June 2025

Check out the June 2025 Power BI update to learn about new features.

June 2025 community update carousel

Fabric Community Update - June 2025

Find out what's new and trending in the Fabric community.