Search code examples
ssasmdxolapolap-cube

How can I get top 3 items sold in particular three days in MDX queries?


This is my MDX query. This will the items that is sold on particular three days. This query returns all items sold, but I wish to get only top 3 items on that particular dates.

How do I can get this? Here's my MDX query:

select
{
    [Measures].[Quantity],
    [Measures].[Net Sales]
}
on columns,
NON EMPTY
ORDER
(
    (
        [Products].[Item Description].children    
    ),
    [Measures].[Quantity], DESC
)
    * [Calendar].[Date].[Date]
on rows
from
(
select 
{
    [Calendar].[Date].&[2015-03-23T00:00:00],
    [Calendar].[Date].&[2015-03-22T00:00:00],
    [Calendar].[Date].&[2015-03-21T00:00:00]
}
ON columns

FROM [SalesReport])

Solution

  • Use the TopCount function as below:

    select
    {
        [Measures].[Quantity],
        [Measures].[Net Sales]
    }
    on columns,
    NON EMPTY
    TopCount([Products].[Item Description].children * [Calendar].[Date].[Date], 
            3,
            [Measures].[Quantity])      
    on rows
    from
    (
    select 
    {
        [Calendar].[Date].&[2015-03-23T00:00:00],
        [Calendar].[Date].&[2015-03-22T00:00:00],
        [Calendar].[Date].&[2015-03-21T00:00:00]
    }
    ON columns
    
    FROM [SalesReport])
    

    To get the top 3 records for each date, you can user the GENERATE function :

    select
    {
        [Measures].[Quantity],
        [Measures].[Net Sales]
    }
    on columns,
    NON EMPTY
    GENERATE([Calendar].[Date].[Date],  
            TopCount([Products].[Item Description].children, 
                    3,
                    [Measures].[Quantity])  
            )   
    on rows
    from
    (
    select 
    {
        [Calendar].[Date].&[2015-03-23T00:00:00],
        [Calendar].[Date].&[2015-03-22T00:00:00],
        [Calendar].[Date].&[2015-03-21T00:00:00]
    }
    ON columns
    
    FROM [SalesReport])