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 中:
- 度量值组
factSales
(包含度量值:TotalAmt、Sales Count、Customer Distinct Count)
- 维度
JoinDate
(基于dimDate
)
- 维度
TransactionDate
(基于dimDate
)
我需要添加一个功能来实现:
例如,用户选择 TransactionDate
从 2015-01-01
到 2015-02-01
。
我需要添加:
- 一个新的计算成员 BaseCustomersAmt,它仅显示 [
2015-01-01
-- 2015-02-01
] 期间 JoinDate
客户的销售额小于 [2015-01-01
] 即 1 年
- 一个新的计算成员 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
)
)
我有数据库和 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 中:
- 度量值组
factSales
(包含度量值:TotalAmt、Sales Count、Customer Distinct Count) - 维度
JoinDate
(基于dimDate
) - 维度
TransactionDate
(基于dimDate
)
我需要添加一个功能来实现:
例如,用户选择 TransactionDate
从 2015-01-01
到 2015-02-01
。
我需要添加:
- 一个新的计算成员 BaseCustomersAmt,它仅显示 [
2015-01-01
--2015-02-01
] 期间JoinDate
客户的销售额小于 [2015-01-01
] 即 1 年 - 一个新的计算成员 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
)
)