MDX - 按日期总销售额计算的前X名销售人员

时间:2012-04-03 22:02:12

标签: ssas mdx

我试图这样做,但在我的立方体中使用MDX:

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

我们说我有一个具有这些尺寸的立方体:

日期(年,月,日) - 日期始终是月份的第1天 业务员

事实表有三列 - Date,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]
      )

我之后的问题是将Date和SalesPerson放在行上的查询,以及列上的TotalSales。

我想看看每个月,每个月,前五名销售人员以及销售量。

当我尝试这样做时,它似乎不会按每个日期过滤/分组销售人员(每个日期获得前5名)。返回的值遍布整个地方,包含非常低和空的值。值得注意的是,SalesPerson列表对于每个日期都是相同的,即使TotalSales变化很大。

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

似乎所有内部​​&#34;子集&#34;需要按当前[日期]。[层次结构]。[日期]进行过滤,但使用CurrentMember会产生交叉连接/轴错误:

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
  

错误:执行查询...查询(3,2)层次结构层次结构   在Crossjoin函数中使用了不止一次。

     

执行完成

我已经尝试了上一次查询的几种变体而没有运气。

希望这些答案对新手MDX也有帮助。

1 个答案:

答案 0 :(得分:0)

我最终发现了如何做我想要的。解决方案围绕着使用Generate函数,从MSDN上的基本示例开始,将维度和度量修改为我的立方体中的那些,让我朝着正确的方向前进。

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

有更好的方法吗?

另外,要小心尝试将集合重构为with块。当评估/更改其范围并改变结果时,这似乎会改变。

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