根据MDX / SSAS中的选定日期创建动态过滤器

时间:2014-06-23 22:52:39

标签: sql-server filter ssas mdx

在SQL Server Analysis Services(2008)中,我在DSV中有一个事实表,如下所示:

DOC_NO    RECORD_NO    REPORT_DATE    CREATE_DATE    CLEAR_DATE    INVOICE_TOTAL
1         2000         1/1/2014       12/1/2013      NULL          $1000.00
2         2001         3/1/2014       1/14/2014      3/1/2014      $1001.00
3         2002         6/1/2014       1/31/2014      6/1/2014      $1002.00
4         2003         2/15/2014      2/14/2014      NULL          $1003.00
5         2004         7/31/2014      2/28/2014      7/31/2014     $1004.00

(假设我们分别有[DOC_NO]和[RECORD_NO]的尺寸)

在立方体中,我们有一个[时间] - > [月] - > [周] - > [日期]尺寸。选定的维值过滤事实表中的REPORT_DATE值。基本上,如果一个月内存在REPORT_DATE值,我们会显示数据行。

场景:在我们的报告解决方案中,当用户从时间过滤器中选择一个月时,期望的结果是我们仅过滤符合此条件的行的事实表数据:

REPORT_DATE >= CREATE_DATE AND (REPORT_DATE <= CLEAR_DATE OR CLEAR_DATE IS NULL)

这基本上可以说明文件是否是&#34; OPEN&#34;或者&#34; CLOSED&#34;在一个月内。通常情况下,我们会在DSV的命名查询中有条件地执行此类操作,但由于动态时间过滤,我们无法提前完成。

关于如何实现我们正在寻找的目标的任何想法?基本上创建一个计算的度量或MDX语句,其作用类似于动态维度过滤器。

2 个答案:

答案 0 :(得分:1)

你可以试试这个..

使用您提到的计算在事实表中创建命名计算(例如“状态”)。此列将具有“OPEN”或“CLOSED”值。现在在事实表的顶部构建一个退化维度,它将“Status”作为属性。在MDX查询中使用此属性可选择选定月份的“打开”或“已关闭”文档。

让我知道这是否适合您。

答案 1 :(得分:0)

以下是基于新维度的解决方案,用于确定是否打开文档。

测试数据:

create table Data (DOC_NO int,RECORD_NO int,REPORT_DATE datetime,CREATE_DATE datetime,CLEAR_DATE datetime,INVOICE_TOTAL money)

insert Data(DOC_NO,RECORD_NO,REPORT_DATE,CREATE_DATE,CLEAR_DATE,INVOICE_TOTAL)
select 1,2000,'1/1/2014','12/1/2013',NULL,1000.00 union all
select 2,2001,'3/1/2014','1/14/2014','3/1/2014',1001.00 union all
select 3,2002,'6/1/2014','1/31/2014','6/1/2014',1002.00 union all
select 4,2003,'2/15/2014','2/14/2014',NULL,1003.00 union all
select 5,2004,'7/31/2014','2/28/2014','7/31/2014',1004.00
  1. 就您的示例所示,所有这些行都是open-docs。所以让我们添加错误日期的新行:

    插入数据(DOC_NO,RECORD_NO,REPORT_DATE,CREATE_DATE,CLEAR_DATE,INVOICE_TOTAL) 选择6,2005,'7/31/2014','8/31/2014',NULL,2005.00

  2. 向ETL-process添加维度键:

    alter table数据添加REPORT_DATE_ID int,CREATE_DATE_ID int,CLEAR_DATE_ID int

  3. 使用相应的值映射它们:

    更新数据集     REPORT_DATE_ID = ISNULL(转换(VARCHAR,REPORT_DATE,112),19000101),     CREATE_DATE_ID = ISNULL(转换(VARCHAR,CREATE_DATE,112),19000101),     CLEAR_DATE_ID = ISNULL(转换(VARCHAR,CLEAR_DATE,112),19000101)

  4. 以下是我们的结果:

    按REPORT_DATE从数据顺序中选择* table Data

  5. 使用您的条件在DataSourceView中创建命名计算'IsOpened':

    REPORT_DATE&gt; = CREATE_DATE AND(REPORT_DATE&lt; = CLEAR_DATE或CLEAR_DATE为空)的情况,然后1其他0结束

  6. 根据此计算添加新维度(例如,使用CREATE VIEW视图vwIsOpened作为选择0作为ID联合全部选择1)

  7. 按维度和命名计算的关键点连接维度和数据多维数据集。

  8. 将计算成员添加到多维数据集:

    创建成员CURRENTCUBE。[Measures]。[IsOpenedDoc]  如 IIF([报告日期]。[报告日期] .CurrentMember.Level是[报告日期]。[报告日期]。[月] ,([已打开]。[已打开]。&amp; 1,[Measures]。[Count]) ,空值), 可见= 1;

  9. 我不知道为什么这种行为只使用了几个月(据我所知),但仍然将其添加到IIF条件中。也许最好只使用第二行的简单元组。

    结果如下:

    Result

    这个新计算的衡量标准仅适用于真正开放的文档。表格的最后一行对应于[已打开]。[已打开]。&amp; [0]。

    我第一次尝试使用动态MDX,例如'SUM({NULL:StrToMember(“[创建日期]。[创建日期]。[月]。&amp; [”+ [报告日期]。[报告日期] ] .CurrentMember.Member_Key + “]”)},[措施]。[COUNT])”。但这只有在几个月内没有“漏洞”的情况下才有效(在你的例子中我们没有创建日期2014-03,所以这个方法不起作用)。

    希望有人能够仅根据MDX功能(过滤器,聚合等)提供更简单的解决方案,但我负担不起。