2012-04-03 61 views
0

我试图做到这一点总销售额,但在我的立方体MDX:MDX - 前X销售人员通过为每个日期

select 
    * 
from 
(
    select 
     Date, SalesPerson, TotalSales, row_number() over(partition by Date order by TotalSales desc) as Num 
    from SalesFact as ms 
) as x 
where 
    Num < 5 
order by 
    Date, SalesPerson, Num desc 

比方说,我有这些尺寸的立方体:

日期(年,月,日) - 日期始终为第一个月 SalesPerson

事实表有三列 - 日期,SalesPerson,TotalSales - 即该人在当月销售的金额。

我想,每个月,看到前5名销售人员,以及他们的每一个TotalSales的。排名前五的销售人员可能每个月都会有所不同。

我能够得到的结果一个月,使用查询,看起来像这样:

select 
     [Measures].[TotalSales] on columns, 
     (
      subset 
      (
        order 
        (
         [SalesPerson].children, 
         [Measures].[TotalSales], 
         bdesc 
       ), 
        0, 
        5 
      ) 
    ) on rows 
from 
     Hypercube 
where 
     (
      [Date].[Date].&[2009-03-01T00:00:00] 
    ) 

我后是把日期和行营业员,并TotalSales在列的查询。

我想每个月看到随着时间的推移,以及每个月的前5名销售人员,以及有多少他们卖。

当我尝试做这种方式,它似乎并没有过滤/组销售人员每个日期(获取每个日期前5名)。返回的值遍布整个地方,并包含非常低的值和空值。值得注意的是,尽管TotalSales差别很大,但SalesPerson列表对于每个日期都是相同的。 。

select 
    [Measures].[TotalSales] on columns, 
    (
     [Date].[Hierarchy].[Date].members, 
     subset 
     (
      order 
      (
       [SalesPerson].children, 
       [Measures].[TotalSales], 
       bdesc 
      ), 
      0, 
      5 
     ) 
    ) on rows 
from 
    Hypercube 

似乎内部 “子集” 一切都需要由电流[日期]被过滤[层次] [日期],但使用CurrentMember给出CROSSJOIN /轴误差:

select 
    [Measures].[TotalSales] on columns, 
    (
     [Date].[Hierarchy].[Date].members, 
     subset 
     (
      order 
      (
       ([SalesPerson].children, [Date].[Hierarchy].CurrentMember), 
       [Measures].[TotalSales], 
       bdesc 
      ), 
      0, 
      5 
     ) 
    ) on rows 
from 
    Hypercube 

我已经试过,没有运气的最后一个查询的几种变化。

希望的答案将是帮助他人新MDX也是如此。

回答

0

我终于找到了如何做到什么,我一直在寻找。解决方案围绕使用Generate函数展开,并从MSDN上的基本示例开始,并将维度和度量修改为我的多维数据集中的维度和度量,这使我朝着正确的方向前进。

http://msdn.microsoft.com/en-us/library/ms145526.aspx

有没有更好的办法?

另外,警惕试图重构套入与块。当集合被评估/改变其范围并且将改变结果时,这似乎改变。

with 

set 
Dates as 
{ 
    [Date].[Hierarchy].[Date].&[2009-02-01T00:00:00], 
    [Date].[Hierarchy].[Date].&[2009-03-01T00:00:00], 
    [Date].[Hierarchy].[Date].&[2009-04-01T00:00:00] 
} 

select 
    Measures.[TotalSales] 
    on columns, 
    generate 
    (
     Dates, 
     topcount 
     (
      [Date].Hierarchy.CurrentMember 
      * 
      [SalesPerson].Children, 
      5, 
      Measures.[TotalSales] 
     ) 
    ) 
    on rows 
from 
    Hypercube 
相关问题