我试图这样做,但在我的立方体中使用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也有帮助。
答案 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