如何在SSAS多维Cube中计算上周最后一天与本周最后一天
多维Cube中计算上周/本周最后一天的实现方案
嘿,针对你在多维Cube里要计算上周最后一天和本周最后一天的需求,结合你给出的时间维度结构和Time Week维度的视图数据,我整理了几个实用的实现方案,应该能帮到你:
一、利用现有Time Week维度直接计算(最推荐)
你提供的Time Week维度视图里已经包含了每个周的EndDate(比如Week-2018-W18的EndDate是2018-05-06,正好是该周的最后一天),直接复用这个属性是最高效的方式,不用额外做日期运算。
MDX查询示例
WITH -- 计算当前选中周的最后一天 MEMBER [Measures].[本周最后一天] AS [Time Week].[Time-week].CurrentMember.Properties("EndDate"), FORMAT_STRING = 'yyyy-MM-dd' -- 计算上一个周的最后一天 MEMBER [Measures].[上周最后一天] AS [Time Week].[Time-week].CurrentMember.PrevMember.Properties("EndDate"), FORMAT_STRING = 'yyyy-MM-dd' SELECT {[Measures].[本周最后一天], [Measures].[上周最后一天]} ON COLUMNS, [Time Week].[Time-week].Members ON ROWS FROM [YourCubeName]
说明
- 这里的
PrevMember会自动定位到当前周成员的上一个时间顺序的周成员,哪怕是跨年度的周(比如2023年最后一周到2024年第一周)也能正确识别。 - 记得把
[YourCubeName]替换成你实际的Cube名称。
二、基于其他时间层次结构的计算(比如Year-Week)
如果你的查询场景是基于Year-Week这类没有直接存储EndDate的层次结构,可以通过MDX的日期函数来推导:
MDX查询示例
WITH -- 计算当前日期所在周的最后一天(这里假设周一为周起始,周日为周结束) MEMBER [Measures].[本周最后一天] AS VBA!DateAdd("d", 6 - VBA!Weekday([Date].[Date].CurrentMember.MemberValue, 2), [Date].[Date].CurrentMember.MemberValue), FORMAT_STRING = 'yyyy-MM-dd' -- 上周最后一天 = 本周最后一天减7天 MEMBER [Measures].[上周最后一天] AS VBA!DateAdd("d", -7, [Measures].[本周最后一天]), FORMAT_STRING = 'yyyy-MM-dd' SELECT {[Measures].[本周最后一天], [Measures].[上周最后一天]} ON COLUMNS, [Date].[Year-Week].Members ON ROWS FROM [YourCubeName]
说明
VBA!Weekday函数的第二个参数2代表周一为一周的第一天,如果你的业务定义是周日为周起始,把参数改成1即可,对应的偏移量也要调整为0(因为周日是Weekday返回1,1-1=0,DateAdd加0天就是当天)。- 这个方法依赖日期维度的
Date层级的MemberValue是标准日期格式,确保能被VBA函数识别。
三、在Cube中持久化计算成员
如果需要让所有用户都能直接使用这些计算,不用每次写MDX,可以在Cube的计算脚本中预先定义这些成员:
Cube计算脚本示例
-- 在Time Week维度下创建计算成员 CREATE MEMBER [Time Week].[Time-week].[本周最后一天] AS [Time Week].[Time-week].CurrentMember.Properties("EndDate"), FORMAT_STRING = 'yyyy-MM-dd', VISIBLE = 1 CREATE MEMBER [Time Week].[Time-week].[上周最后一天] AS [Time Week].[Time-week].CurrentMember.PrevMember.Properties("EndDate"), FORMAT_STRING = 'yyyy-MM-dd', VISIBLE = 1
说明
- 定义后,用户在查询时可以直接引用
[Time Week].[Time-week].[本周最后一天]这类成员,就像使用普通维度成员一样。 - 确保Time Week维度的
EndDate属性已经在维度设计中设置为“可访问”,否则Properties函数无法读取该值。
注意事项
- 先确认Time Week视图中的
EndDate是否完全符合你的业务周定义(比如是否是当天的23:59:59,还是只存日期部分),如果需要格式化,可以在MDX中用FORMAT_STRING调整显示格式。 - 如果你的Cube使用的是其他OLAP引擎(比如Apache Kylin、Mondrian),语法可能略有差异,但核心逻辑是一致的——要么复用已有的周结束日期属性,要么通过日期函数推导。
内容的提问来源于stack exchange,提问作者Sandhya Balakrishnan
相关产品推荐
相关产品推荐

