多个维度的排名,每年重新启动

时间:2016-11-22 19:57:54

标签: ssas mdx

我有一个衡量标准,即销售金额。我希望按年度将客户排在一个分区内。我还需要将该等级显示为度量。排名需要每年开始。我能够按年份按客户和客户划分,但我似乎无法弄清楚如何将它们结合起来,以便在两个维度上进行适当的迭代。以下是我每年为客户提供的服务。我尝试添加另一个Division集,使用YearsWithCustomers设置创建另一个名为GENERATE的命名集,并使用该新命名集创建RANK。我似乎非常接近于弄清楚这一点,但我认为我把东西放在了错误的地方。我有想法从Chris Webb的一个博客located here迭代一套。

WITH 
  SET Years AS 
    TopPercent
    (
      [Sales and Forecast Date].[Calendar Year].[Year Number].MEMBERS
     ,100
     ,[Measures].[Sales Amount]
    ) 
  SET Customers AS 
    Filter
    (
      [Customer].[Customer Number].[Customer Number].MEMBERS
     ,
      [Measures].[Sales Amount] > 0
    ) 
  SET YearsWithCustomers AS 
    Generate
    (
      Years
     ,Union
      (
        {[Sales and Forecast Date].[Calendar Year].CurrentMember}
       ,StrToSet
        ("
            Intersect({},
           {order(Customers,([Sales Amount],[Sales and Forecast Date].[Calendar Year].CurrentMember),desc)
            as CustomerSet"
            + 
              Cstr(Years.CurrentOrdinal)
          + "})"
        )
      )
     ,ALL
    ) 
  MEMBER [Measures].[Customer Rank] AS 
    Rank
    (
      [Customer].[Customer Number].CurrentMember
     ,StrToSet
      ("CustomerSet"
        + 
          Cstr
          (
            Rank
            (
              [Sales and Forecast Date].[Calendar Year].CurrentMember
             ,Years
            )
          )
      )
    ) 
SELECT 
  {
    [Customer Rank]
   ,[Measures].[Sales Amount]
  } ON 0
 ,Order
  (
    Filter
    (
      (
        YearsWithCustomers
       ,Customers
      )
     ,
      [Sales Amount] > 0
    )
   ,[Sales Amount]
   ,desc
  ) ON 1
FROM [OrdersAndBudgets];

这是我现在拥有的。我希望看到Rank测量的1,2,3等。每年应为每个部门重置一次。

Example with wrong results

1 个答案:

答案 0 :(得分:1)

我喜欢这种模式:

WITH 
  SET [AllCountries] AS 
    [Country].[Country].MEMBERS 
  SET [AllProds] AS 
    [Product].[Product].[Product].MEMBERS 
  SET [Top5Prods] AS 
    Generate
    (
      [AllCountries] AS a
     ,{
          (
            a.CurrentMember
           ,[Product].[Product].[All]
          )
        + 
            //The top x prods
            a.CurrentMember
          * 
            TopCount
            (
              [AllProds]
             ,5
             ,[Measures].[Internet Sales Amount]
            )
      }
    ) 
  MEMBER [Product].[Product].[All].[Other Products] AS 
    Aggregate
    (
        [Country].CurrentMember * [Product].[Product].[Product].MEMBERS
      - 
        [Top5Prods]
    ) 
SELECT 
  {[Measures].[Internet Sales Amount]} ON COLUMNS
 ,Hierarchize(
    {
     [Top5Prods]
    ,[AllCountries] * [Product].[Product].[All].[Other Products]
    }
) ON ROWS
FROM [Adventure Works];

返回以下内容:

enter image description here

这里有一个非常广泛的主题:Top X of Top Y with RestOf member where X and Y are hierarchies from different dimensions