在业务中经常要求不但需要知道指标的当月表现,而且需要知道近期的趋势,一般是通过对该指标过去12个月的表现来实现的。
问题描述
以一个超市的洗衣粉销售为例,有如下的实事表:
品名(productName) 单价(unitPrice) 数量(qty) 日期(年月)
......
......
立白 4.0 30 200807
立白 4.2 50 200808
立白 4.2 50 200808
汰渍 5.0 40 200807
汰渍 5.0 40 200808
汰渍 5.2 40 200809
......
......
现在我想计算洗衣粉在8,9,10,11月份的年销售额,这里的年销售额大家可能会误解,2008年8月的
年销售额指的是从2007年9月到2008年8月这一年里的所有品牌所所有洗衣粉的销售总额,依次类推。
请问我怎么用MDX写出这样的查询。
我的难点有两个:
1、我没有办法汇总单个月份的年销售总额
2、有没有办法同时得出几个月的年销售总额
问题来源:CSDN yls087412(http://hi.csdn.net/yls087412)
假设
1、以MS2000 SASS自带Foodmart为例;
2、假使[Measures].[Unit Sales],[Measures].[Sales Count]分别代表平均单价(注意:架设已经有效平均)和销售数量。
解答
为了便于掌握,逐步解析如下:
1、对过去12个月的获取
with set [过去12个月份] AS 'LastPeriods(12,[Time].[1998].[Q4].[10])'
select {[过去12个月份]} on columns
from sales
返回的结果只有列头,各列分别表示[Time].[1998].[Q4].[10]之前(包括它自己)刚刚过去的12个月,即[Time].[1997].[Q4].[11]~[Time].[1998].[Q4].[10]
2、获取过去12个月中,每个月的销售额
with set [过去12个月份] AS 'LastPeriods(12,[Time].[1998].[Q4].[10])'
member [Measures].[销售额] AS '[Measures].[Unit Sales]*[Measures].[Sales Count]',FORMAT_STRING = '#.00'
select {[Measures].[Unit Sales],[Measures].[Sales Count],[Measures].[销售额]} on rows, {[过去12个月份]} on columns
from sales
返回结果的列头如上次,行头分别为平均单价、销售数量、销售额。
3、汇总单个月过去12个月的销售额
with member [Time].[过去12个月份合计] AS 'Aggregate(LastPeriods(12,[Time].[1998].[Q4].[10]))'
member [Measures].[销售额] AS '[Measures].[Unit Sales]*[Measures].[Sales Count]',FORMAT_STRING = '#.00'
select {[Measures].[销售额]} on columns,
{[Time].[过去12个月份合计]} on rows
from sales
4、同时得出针对指定的几个月的过去12个月的销售额总计
4.1 如果是随机指定的几个月份,则这样写:
with member [Measures].[过去12个月份销售额合计] AS 'sum(LastPeriods(12,[Time].CurrentMember),[Measures].[Unit Sales]*[Measures].[Sales Count])',FORMAT_STRING = '#.00'
select {[Measures].[过去12个月份销售额合计]} on columns,
{[Time].[1998].[Q3].[8],[Time].[1998].[Q3].[9],[Time].[1998].[Q4].[10]} on rows
from sales
4.2 如果关注的连续的月份,则可以使用时间函数。比如如果关注的是当前月份(假定是[Time].[1998].[Q4].[10])的前三个月,对其中每个月求过去12个月的销售额合计,则这样写:
with set [关注月份] AS 'LastPeriods(3,[Time].[1998].[Q4].[10])'
member [Measures].[过去12个月份销售额合计] AS 'sum(LastPeriods(12,[Time].CurrentMember),[Measures].[Unit Sales]*[Measures].[Sales Count])',FORMAT_STRING = '#.00'
select
{[Measures].[过去12个月份销售额合计]} on columns,
{[关注月份]} on rows
from sales
5.关于问题中产品维
处理指标维和时间维,其他维度(比如问题中的产品维),应该不受影响。
6.补充说明一个老话题:
需要注意的是,建立Cube时,销售额应该在事实表的级别用单价和数量在第一轮首先计算出来结论才正确. 否则,采用"月份总额=月份单价聚合*月份数量聚合"是不正确的. 详情参考:http://blog.csdn.net/Mr_JBean/archive/2008/11/04/3220255.aspx