0

我正在尝试这样做,但是在我的多维数据集中使用 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 日 SalesPerson

事实表有三列——Date、SalesPerson、TotalSales——即那个人在那个月的销售量。

我希望每个月查看排名前 5 位的销售人员,以及他们的每个 TotalSales。前 5 名销售人员可能会因一个月而异。

我可以使用如下所示的查询获得一个月的结果:

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 名销售人员,以及他们的销售额。

当我尝试这样做时,它似乎没有按每个日期过滤/分组销售人员(每个日期获得前 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

似乎“子集”内的所有内容都需要按当前 [Date].[Hierarchy].[Date] 过滤,但使用 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) Hierarchy 层次结构在 Crossjoin 函数中多次使用。

执行完成

我已经尝试了最后一个查询的几种变体,但没有运气。

希望这些答案对其他刚接触 MDX 的人也有帮助。

4

1 回答 1

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
于 2012-04-05T18:30:59.477 回答