使用MDX为每个客户返回其在指定日期范围内的最新状态。
示例数据集:
Client | Status | Date
A | Pending | 30-Jun-12
A | Pending | 01-Jul-12
A | Active | 02-Jul-12
A | Active | 03-Jul-12
B | Pending | 01-Jun-12
B | Active | 02-Jun-12
B | Active | 03-Jun-12
B | Active | 04-Jun-12
其他信息: (在7月7日至12日期间,客户A没有记录,因为他们不再接收服务) (客户B在4月6日之后没有记录,因为他们不再接收服务)
必需的输出: 如果在2012年6月全部过滤日期维度,则应返回
Client | Status | Date
A | Pending | 30-Jun-12
B | Active | 04-Jun-12
环境: SSAS 2005 | SS 2008 R2 | VS 2008
希望使用计算成员或命名集,但任何帮助/指导都非常感谢......
答案 0 :(得分:0)
由于您缺少很多细节,我只是假设缺少信息:
[Client].[Client]
。[Status].[Status]
,i。即它与Client
维度处于不同的维度。[Date].[Date]
,日级为[Date].[Date].[Day]
,月级为[Date].[Date].[Day]
。201206
。Sales
。Cube
。然后
WITH Set [Days] as
Descendants([Date].[Date].CurrentMember, [Date].[Date].[Day])
Member [Measures].[Date] as
Exists([Days], {[Client].[Client].CurrentMember}, 'Sales')
.Item(Exists([Days], {[Client].[Client].CurrentMember}, 'Sales').Count - 1)
.Item(0)
.Name
SELECT { [Measures].[Date] }
ON COLUMNS,
NON EMPTY
[Client].[Client].[Client].Members
*
[Status].[Status].[Status].Members
ON ROWS
FROM [Cube]
WHERE [Date].[Date].[Month].&[201206]
应该提供你想要的东西。
[Days]
集包含过滤日期范围内的所有日期。然后,Date
度量计算如下:Exists
将Days
限制为当前客户端的值,Item
从该集合中提取最后一个元组,第二个Item
将此转换为成员,然后将此成员的名称作为Date
度量返回。
修改强>
要获得每个状态不是一行,而是最后一个状态(假设每天最多只有一个记录),您也可以将状态转换为度量:
WITH Set [Days] as
Descendants([Date].[Date].CurrentMember, [Date].[Date].[Day])
Member [Measures].[Date] as
Exists([Days], {[Client].[Client].CurrentMember}, 'Sales')
.Item(Exists([Days], {[Client].[Client].CurrentMember}, 'Sales').Count - 1)
.Item(0)
.Name
Member [Measures].[Status] as
Exists([Status].[Status].[Status].Members,
{ Exists([Days], {[Client].[Client].CurrentMember}, 'Sales')
.Item(Exists([Days], {[Client].[Client].CurrentMember}, 'Sales').Count - 1)
},
'Sales'
)
.Item(0)
.Item(0)
.Name
SELECT { [Measures].[Status], [Measures].[Date] }
ON COLUMNS,
NON EMPTY
[Client].[Client].[Client].Members
ON ROWS
FROM [Cube]
WHERE [Date].[Date].[Month].&[201206]
Exists
小节的外Status
找到包含日期状态的一个元素集,然后通过两个Item(0)
调用转换为成员,我们可以从中转发得到名字。