在定义的日期范围内使用MDX获取客户端状态

时间:2013-10-15 23:44:34

标签: sql sql-server ssas mdx

使用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

希望使用计算成员或命名集,但任何帮助/指导都非常感谢......

1 个答案:

答案 0 :(得分:0)

由于您缺少很多细节,我只是假设缺少信息:

  • 不需要多选。
  • 您的客户端层次结构名为[Client].[Client]
  • 您的状态层次结构名为[Status].[Status],i。即它与Client维度处于不同的维度。
  • 您的日期层次结构名为[Date].[Date],日级为[Date].[Date].[Day],月级为[Date].[Date].[Day]
  • 2012年6月的会员密钥为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度量计算如下:ExistsDays限制为当前客户端的值,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)调用转换为成员,我们可以从中转发得到名字。