SSAS:动态过滤日期维度成员

时间:2016-08-18 01:57:27

标签: sql-server filtering ssas mdx

我有数据库和SSAS。

在DB中:

1)事实表factSales

+-----------------+----------+
| ColumnName      | Datatype |
+-----------------+----------+
|    JoinDate     |   date   |
| TransactionDate |   date   |
|       Amt       |   money  |
|   CustomerId    |    int   |
|    .......                 |
|    .......                 |
+-----------------+----------+

2)时间维度表dimDate

+-----------------+----------+
|   ColumnName    | Datatype |
+-----------------+----------+
|      Date       |   date   |
|   MonthNumber   |   date   |
|       Year      |    int   |
|       Week      |    int   |
|    .......                 |
|    .......                 |
+-----------------+----------+

在SSAS中:

  • 度量组factSales(包含度量:TotalAmt,Sales Count,Customer Distinct Count)
  • JoinDate(基于dimDate
  • TransactionDate(基于dimDate

我需要添加一个功能来实现:

例如,用户从TransactionDate2015-01-01选择2015-02-01 我需要补充一下:

  1. 新的计算成员 BaseCustomersAmt ,其中2015-01-01小于[{}的客户仅显示[2015-02-01 - JoinDate]期内的销售额{1}}]即1年
  2. 新计算成员 NewCustomersAmt ,其中2015-01-01大于等于的客户仅显示[2015-01-01 - 2015-02-01]期内的销售额至[JoinDate]即1年
  3. 所以,我的想法是我需要将总销售额( 2015-01-01 )分成两组 -

      

    第一组是从选定期间加入1年以上的人,
      第二组其余的人 - 在选定期间1年前的日期或之后加入。

    当然,用户可以创建两个单独的报告并使用不同的加入日期范围,但要求是在一个报告中执行并自动执行。

    有可能实现吗?请帮忙。

1 个答案:

答案 0 :(得分:1)

当你说

  

例如,用户选择2015-01-01至2015-02-01的交易日期。

我将假设它处于日期级别,并计算每个日期。由于我不知道你是否有一个具有年 - 日关系的时间层次结构,所以我只需要使用LAG(365)去找一年。否则,您可以使用PARALLELPERIOD

CREATE MEMBER [Measures].[BaseCustomersAmt]
AS
AGGREGATE(
    {
       NULL
       :LINKMEMBER([TransactionDate].[Date].CURRENTMEMBER,[JoinDate].[DATE]).LAG(365)
    }
    ,[Measures].[Sales]
),VISIBLE=1;


CREATE MEMBER [Measures].[NewCustomersAmt]
AS
AGGREGATE(
    {
        LINKMEMBER([TransactionDate].[Date].CURRENTMEMBER,[JoinDate].[DATE]).LAG(365)
       :LINKMEMBER([TransactionDate].[Date].CURRENTMEMBER,[JoinDate].[DATE])
    }
    ,[Measures].[Sales]
),VISIBLE=1;

编辑:

假设您有一个年 - 月 - 日期层次结构。

CREATE MEMBER [Measures].[NewCustomersAmt]
AS
AGGREGATE(
    {
        ParallelPeriod(
            [JoinDate].[YearMonthDate].[Year]
            ,1
            ,LINKMEMBER([TransactionDate].[YearMonthDate].CURRENTMEMBER,[JoinDate].[YearMonthDate])
        )
       :LINKMEMBER([TransactionDate].[YearMonthDate].CURRENTMEMBER,[JoinDate].[YearMonthDate])
    }
    ,[Measures].[Sales]
),VISIBLE=1;

对于动态延迟......我猜它会变得更棘手......但你可以尝试在你的baseDayDimension上进行LAG。不知道是否会奏效。

.LAG(
    iif([baseDayDimension].[Day].CURRENTMEMBER IS[baseDayDimension].[Day].[All]
       ,365
       ,[baseDayDimension].[Day].CURRENTMEMBER.MEMBER_VALUE
     )
)