我有一个由物理日期表支持的日历日期维度(最初是在 SQL Server 2000 上创建的,因此是日期时间而不是日期):
CREATE TABLE [dbo].[PostDate_Dimension](
[post_date] [datetime] NOT NULL PRIMARY KEY,
[day_of_year] [int] NOT NULL,
[day_of_month] [int] NOT NULL,
[month_of_year] [int] NOT NULL,
[post_year] AS (datepart(year,[post_date])),
[post_month] AS (datepart(month,[post_date])),
[post_day] AS (datepart(day,[post_date]))
)
Post Date 维度有四个属性(列出了成员键列,其中一些在 DSV 中计算):
- 日期(维度键)- post_date
- 月 - post_year, post_month
- 季度 - post_year,post_quarter =
DatePart(quarter, "post_date"))
- 年份 - post_year
显然,这没什么太花哨的。我还有一些计算度量,它们使用 ParallelPeriod 来计算上一年的 YTD 数据,以便快速并排比较,而无需用户选择特定的日期片段。只需选择当前年份,它就会找到其中包含销售额的最新日期,然后与上一年的相同范围进行比较。
在上一年找到合适的日期通常归结为:
ParallelPeriod(
[Post Date].[Post Date].[Year],
1,
Tail(
NonEmpty(
Descendants(
[Post Date].CurrentMember,
,
Leaves
),
Measures.[Total Price]
),
1
).Item(0)
)
Tail 调用是它在当前选定的 Post Date 成员(通常是当前年份)下查找最新日期的地方。这很好用。但是,如果返回 2 月 29 日,这意味着特定维度成员组合的最后一次销售发生在 2 月 29 日,那么它将 2 月 29 日传递给 ParallelPeriod 函数,该函数随后返回 null。然后上一年的 YTD 度量也返回 null。
所以,简而言之:基于这个特定的模式,有没有一种简单的方法可以让 ParallelPeriod 在 2 月 29 日的输入中表现良好?如果它只是返回上一年的 2 月 28 日,那很好。
编辑:
我尝试过的几件事:
- 使用这个表达式来调整 Post Date 成员:
Iif(MONTH([Post Date].[Post Date].CurrentMember.Member_Caption) = 2 And DAY([Post Date].[Post Date].CurrentMember.Member_Caption) = 29, [Post Date].[Post Date].CurrentMember.PREVMEMBER, [Post Date].[Post Date].CurrentMember)
这行得通,但代码会很糟糕,因为我必须[Post Date].[Post Date].CurrentMember
用Tail(NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price]), 1).Item(0))
. - 使用 except 从结果中删除所有 2 月 29 日的日期
NonEmpty(Descendants([Post Date].CurrentMember,, Leaves), Measures.[Total Price])
。我无法找出正确的语法(如果有的话)来从维度中获取所有 2 月 29 日的集合。 - 使用用户定义的函数创建一个 .NET 程序集,该函数将成员作为参数,如果是 2 月 29 日则返回前一个成员。似乎 Microsoft.AnalysisServices.AdomdServer 中的类非常有限,甚至没有允许这个基本任务(甚至不检索成员键作为日期值)。
好吧,我想我有一个可以忍受的解决方法。首先,我在多维数据集中创建了一个命名集,名为 Feb29:
然后我修改了查找最新销售日期的计算部分(注意
- Feb29
):因此,当它查找 2012 年的最新销售日期时,它将忽略 2 月 29 日,而是与上一年 1 月 1 日至 2 月 28 日的销售情况进行比较。如果有更好的方法可以做到这一点(特别是我使用的那个糟糕的过滤器表达式),我仍然愿意接受建议。
另一种选择是使用联合来获取当前成员和前一个成员的并行时间段。然后从中提取第一项,它将始终是当前成员(除了 2 月 29 日的情况,它应该回退到前一个成员)。
也就是说,与前一个成员并行周期有效合并,如下所示: