MDX查询:如何比较当年的年初至今数据与上一年的年初数据?

时间:2011-08-17 15:18:50

标签: sql-server ssas mdx

通过以下MDX查询,我试图返回销售数据的比较。

我想将YTD与LYTD进行比较,定义如下:

YTD:今年1月1日(2011年1月1日)至今(2011年8月17日)

LYTD:去年1月1日(2010年1月1日),直到去年(2010年8月17日)

两个时段都应包含相同的天数(闰年给予或需要一天)。

到目前为止,我已经尝试使用YTD()函数来获取今年的数据,但是我没有取得太大的成功,将YTD()函数包装成某些东西以使其返回与去年相同的日期。我使用了LAG(1)和ParallelPeriod(见下面两个例子):

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM((YTD(),[Measures].[Sales]).LAG(1))'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

或者

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(ParallelPeriod(YTD(),1),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

使用ParallelPeriod或LAG时得到的数据总是为去年的销售返回一列空值:

Customer    Sales YTD  Sales LYTD
ABC Screws      $1024       (Null)
ABC Bolts       $2392       (Null)
ABC Nuts        $3735       (Null)

是否可以建议对查询进行更改以返回正确的数据,或者可能提供使用LAG或ParallelPeriod的替代策略?

2 个答案:

答案 0 :(得分:0)

使用类似的东西:

WITH
        MEMBER [Measures].[Sales YTD] AS
            'SUM(YTD(closingperiod([Date].[Calendar].[Date])),[Measures].[Sales])'
        MEMBER [Measures].[Sales LYTD] AS
            'SUM(YTD(PARALLELPERIOD([Date].[Calendar].[Calendar Year],1,closingperiod([Date].[Calendar].[Date]))),[Measures].[Sales])'
        SELECT
            {[Measures].[Sales YTD],[Measures].[Sales LYTD]} ON COLUMNS
        ...

,其中

  • [日期]。[日历]。[日期] - 日期维度中的“日期”级别;
  • closingperiod([日期]。[日历]。[日期]) - 此级别的最后一名成员“Day”(2011年8月17日);
  • [日期]。[日历]。[日历年] - 日期维度中的“年”级别;
  • PARALLELPERIOD([日期]。[日历]。[日历年],1,结束时间([日期]。[日历]。[日期])) - 17 / Aug / 2010。

答案 1 :(得分:0)

在发布问题和进一步实验后不久,以下结构似乎返回了我正在寻找的结果:

WITH
MEMBER [Measures].[Sales YTD] AS
    'SUM(YTD(),[Measures].[Sales])'
MEMBER [Measures].[Sales LYTD] AS
    'SUM(YTD(ParallelPeriod([Time].[Year],1,[Time].CURRENTMEMBER)),[Measures].[Sales])'
SELECT
    {[Sales YTD], [Sales LYTD]} ON COLUMNS
    ...

我会在昨天晚上发布我的回答,但少于100分的用户必须等待8个小时才能回答他们自己的问题。

@Max感谢您的投入,看起来您有同样的想法。因此,即使我使用自己的实现,你也会得到公认的答案。