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

Don't miss out! 2025 Microsoft Fabric Community Conference, March 31 - April 2, Las Vegas, Nevada. Use code MSCUST for a $150 discount. Prices go up February 11th. Register now.

Reply
dgefcoe
New Member

Top N Customers Compared to Last Year's Top N

I have sales data for several customers over time. I am looking to compare this year's top N customers (5 in the example) with last year's top N customer. I am NOT comparing this year's Top N customers against themselves in the prior year.

My sample data below:

YearCustomerSales
2023A173
2023B212
2023C278
2023D588
2023E104
2023F921
2023G721
2023H775
2023I569
2023J891
2024A310
2024B443
2024C64
2024D833
2024E58
2024F465
2024G828
2024H12
2024I203
2024J675

 

The table I am trying to build looks like this:

Customer Rank202320242023 Sales2024 Sales% Change Sales
1FD921833-10%
2JG891828-7%
3HJ775675-13%
4GF721465-36%
5DB588443-25%

 

In 2023 my top customer was F with sales of 921. In 2024 my top customer was D with sales of 833. This was a 10% decrease in sales to my top customer.

1 ACCEPTED SOLUTION
TomMartens
Super User
Super User

Hey @dgefcoe ,

from the sample data I created this model:
image.png

the Table Ranking is based on the below DAX statement:

 

Ranking = 
SELECTCOLUMNS(
    GENERATESERIES( 1 , 10 , 1 ),
    "Rank", ''[Value]
)

 

The above DAX creates a simple table of integers that will be used as a rank.

With some measures I'm able to create the following table visual:
image.png
The measures are:

 

this years Customer = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var currentYear = SELECTEDVALUE( 'dim Years'[Year] )
var thisYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = currentYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        'fact Sales'[Customer],
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( thisYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

this years sales = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var currentYear = SELECTEDVALUE( 'dim Years'[Year] )
var thisYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = currentYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
         CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( thisYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

prev years Customer = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var prevYear = SELECTEDVALUE( 'dim Years'[Year] ) - 1
var prevYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = prevYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        'fact Sales'[Customer],
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( prevYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

prev years Sales = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var prevYear = SELECTEDVALUE( 'dim Years'[Year] ) - 1
var prevYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = prevYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( prevYearsTopNCustomerPath , currentRank)
return
Result

 

 

and change, you have to adjust it so that it will become 10 ...

 

change = 
DIVIDE( [this years sales] , [prev years Sales] )

 

 

Hopefully, this provides what you are looking for.

 

Regards,

Tom



Did I answer your question? Mark my post as a solution, this will help others!

Proud to be a Super User!
I accept Kudos 😉
Hamburg, Germany

View solution in original post

4 REPLIES 4
TomMartens
Super User
Super User

Hey @dgefcoe ,

 

Please comment on my solution if it does not return what you are expecting, if tackles your challenge mark my solution as answer, this will help other users of this community.

 

Thanks,

Tom



Did I answer your question? Mark my post as a solution, this will help others!

Proud to be a Super User!
I accept Kudos 😉
Hamburg, Germany
TomMartens
Super User
Super User

Hey @dgefcoe ,

from the sample data I created this model:
image.png

the Table Ranking is based on the below DAX statement:

 

Ranking = 
SELECTCOLUMNS(
    GENERATESERIES( 1 , 10 , 1 ),
    "Rank", ''[Value]
)

 

The above DAX creates a simple table of integers that will be used as a rank.

With some measures I'm able to create the following table visual:
image.png
The measures are:

 

this years Customer = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var currentYear = SELECTEDVALUE( 'dim Years'[Year] )
var thisYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = currentYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        'fact Sales'[Customer],
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( thisYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

this years sales = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var currentYear = SELECTEDVALUE( 'dim Years'[Year] )
var thisYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = currentYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
         CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( thisYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

prev years Customer = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var prevYear = SELECTEDVALUE( 'dim Years'[Year] ) - 1
var prevYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = prevYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        'fact Sales'[Customer],
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( prevYearsTopNCustomerPath , currentRank)
return
Result

 

 

 

prev years Sales = 
var topnCustomer = 5
var currentRank = SELECTEDVALUE( 'Ranking'[Rank] )
var prevYear = SELECTEDVALUE( 'dim Years'[Year] ) - 1
var prevYearsTopNCustomerPath = 
    CONCATENATEX(
        TOPN( 
            topnCustomer,
            CALCULATETABLE(
                'fact Sales',
                'dim Years'[Year] = prevYear
            ),
            CALCULATE( SUM( 'fact Sales'[Sales] ) ),
            DESC
        ),
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        "|",
        CALCULATE( SUM( 'fact Sales'[Sales] ) ),
        DESC
    )
var Result = PATHITEM( prevYearsTopNCustomerPath , currentRank)
return
Result

 

 

and change, you have to adjust it so that it will become 10 ...

 

change = 
DIVIDE( [this years sales] , [prev years Sales] )

 

 

Hopefully, this provides what you are looking for.

 

Regards,

Tom



Did I answer your question? Mark my post as a solution, this will help others!

Proud to be a Super User!
I accept Kudos 😉
Hamburg, Germany
TomMartens
Super User
Super User

Hey @dgefcoe , 

 

there is no Customer v in your sample data, is this on purpose?

Regards,

Tom



Did I answer your question? Mark my post as a solution, this will help others!

Proud to be a Super User!
I accept Kudos 😉
Hamburg, Germany

You are correct, that should read D. I will fix it.

Helpful resources

Announcements
Las Vegas 2025

Join us at the Microsoft Fabric Community Conference

March 31 - April 2, 2025, in Las Vegas, Nevada. Use code MSCUST for a $150 discount! Prices go up Feb. 11th.

Jan25PBI_Carousel

Power BI Monthly Update - January 2025

Check out the January 2025 Power BI update to learn about new features in Reporting, Modeling, and Data Connectivity.

Jan NL Carousel

Fabric Community Update - January 2025

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