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

SSAS: dynamic filtering of date dimension member

我有数据库和 SSAS。

在数据库中:

1) 事实 table factSales:

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

2)时间维度tabledimDate

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

在 SSAS 中:

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

例如,用户选择 TransactionDate2015-01-012015-02-01
我需要添加:

  1. 一个新的计算成员 BaseCustomersAmt,它仅显示 [2015-01-01 -- 2015-02-01] 期间 JoinDate 客户的销售额小于 [2015-01-01] 即 1 年
  2. 一个新的计算成员 NewCustomersAmt,它仅显示 [2015-01-01 -- 2015-02-01] 期间 JoinDate 客户的销售额大于或等于 [2015-01-01] 即 1 年

所以,我的想法是我需要将总销售额 (TotalAmt) 分成两组 -

first group is those who joined more than 1 year ago from chosen period,
second group the rest - who joined on or after a date which is 1 year ago from a chosen period.

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

是否可以实现?请帮忙。

当你说

For example, user chooses Transaction Date from 2015-01-01 to 2015-02-01.

我将假设它处于日期级别,并将计算每个日期。因为我不知道你是否有一个具有年-日期关系的时间层次结构,所以我将只使用 LAG(365) 返回 1 年前。否则你可以使用 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(
    iif([baseDayDimension].[Day].CURRENTMEMBER IS[baseDayDimension].[Day].[All]
       ,365
       ,[baseDayDimension].[Day].CURRENTMEMBER.MEMBER_VALUE
     )
)