我有数据库和SSAS。
1)事实表factSales
:
+-----------------+----------+
| ColumnName | Datatype |
+-----------------+----------+
| JoinDate | date |
| TransactionDate | date |
| Amt | money |
| CustomerId | int |
| ....... |
| ....... |
+-----------------+----------+
2)时间维度表dimDate
+-----------------+----------+
| ColumnName | Datatype |
+-----------------+----------+
| Date | date |
| MonthNumber | date |
| Year | int |
| Week | int |
| ....... |
| ....... |
+-----------------+----------+
factSales
(包含度量:TotalAmt,Sales Count,Customer Distinct Count)JoinDate
(基于dimDate
)TransactionDate
(基于dimDate
)我需要添加一个功能来实现:
例如,用户从TransactionDate
到2015-01-01
选择2015-02-01
我需要补充一下:
2015-01-01
小于[{}的客户仅显示[2015-02-01
- JoinDate
]期内的销售额{1}}]即1年2015-01-01
大于等于的客户仅显示[2015-01-01
- 2015-02-01
]期内的销售额至[JoinDate
]即1年所以,我的想法是我需要将总销售额( 2015-01-01
)分成两组 -
第一组是从选定期间加入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
)
)