MDX:查找特定年份和上一年的两周指定日期范围的销售额

时间:2017-03-17 10:57:05

标签: reporting-services ssas mdx

我正在创建一个数据集,我最终希望比较特定年份(2014年)和前一年同一周的特定两周日期范围(即指定日期范围的最后一个日期之前的两周)。

到目前为止,我所做的是创建查询以查找指定的两周日期范围的相关数据,如下所示:

SELECT NON EMPTY { 
    [Measures].[Quantity], [Measures].[Total Price]
   ,[Measures].[Contribution Margin], [Measures].[Profit Margin]
    } ON COLUMNS,
    NON EMPTY { 
        ( [Dim Date].[Calender].[Date].[2014-11-20]:[Dim Date].[Calender].[Date].[2014-11-30]
   ,[Dim Store2].[Store Key].&[1024] )
    } on rows
from [DSV_FactStoreSales 1] 

我不明白我是如何得到去年同期的。我查看了ParallelPeriod,但我见过的示例包括currentmember,但在此示例中,我有一个指定的范围,跨越两周。

有没有人知道如何实现这个?我需要将它放在同一个Query中,以便能够将结果集用作SSRS中的数据集。

  

修改

我运行了查询:

SELECT NON EMPTY { 
        [Measures].[Quantity]
        ,[Measures].[Total Price]
        ,[Measures].[Contribution Margin]
        ,[Measures].[Profit Margin]
    } ON COLUMNS,
    NON EMPTY 
        { 
            (
                parallelperiod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-17])
                :
                parallelperiod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-30]),[Dim Store2].[Store Key].&[1024] 
            )
        } on rows
from [DSV_FactStoreSales 1] 

但它给了我结果集:

            Quantity    Total Price Contribution Margin Profit Margin
2014-11-07  1024    1   119.2       47.04               39.46%
2014-11-10  1024    1   31.6        21.1                66.77%
2014-11-25  1024    1   55.2        25.45               46.11%
2014-11-26  1024    2   110.8       65.78               59.37%
2014-11-28  1024    166 20903.62    9101.82             43.54%
2014-11-29  1024    117 11870.75    5535                46.63%
2014-11-30  1024    50  9148.8      4008.13             43.81%
2014-12-01  1024    91  11574.39    4933.01             42.62%
2014-12-02  1024    21  2776.8      1254.12             45.16%

与受欢迎的效果相比,日期特别明显。

  

编辑2

我已经尝试了查询

Select Non empty {[Measures].[Total Price]} on 0,
([Dim Date].[Calender].[Date].members) on 1
FROM (Select
        {
            (parallelperiod([Dim Date].[Calender].[Month],4,[Dim Date].[Calender].[Date].[2014-11-22])
            :parallelperiod([Dim Date].[Calender].[mONTH],4,[Dim Date].[Calender].[Date].[2014-14-28]), [Dim Store2].[Store Key].&[1041])
        } on columns
from [DSV_FactStoreSales 1])

但这导致从2014-07-262018-05-02显示销售额。可能存在一些基础层次结构错误,还是我误解了ParallelPeriod()Please note我在最后一个示例Query中对Month进行了一些测试。

  

编辑3“使用With MEMBER方法”

我也尝试过建议的解决方案来调用WITH Member AS,如下所示:

With
Member [Measures].[QuantityParallelPeriod] as
(
    ParallelPeriod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].CurrentMember),
    [Measures].[Quantity]
)
Select Non empty {[Measures].[QuantityParallelPeriod],[Measures].[Total Price]} on 0,
non empty{([Dim Date].[Calender].[Date].members)} on 1
FROM (Select
        {
            (parallelperiod([Dim Date].[Calender].[MOnth],4,[Dim Date].[Calender].[Date].[2014-11-22])
            :parallelperiod([Dim Date].[Calender].[MOnth],4,[Dim Date].[Calender].[Date].[2014-11-28]), [Dim Store2].[Store Key].&[1024])
        } on columns
from [DSV_FactStoreSales 1])

但结果是

                        Quantity
                        Parallel
                        Period  Total Price
            2014-11-07  (null)  119.2
            2014-11-10  (null)  31.6
            2014-11-25  (null)  55.2
            2014-11-26  (null)  110.8
            2014-11-28  (null)  20903.62
            2014-11-29  (null)  11870.75
            2014-11-30  (null)  9148.8
            2014-12-01  (null)  11574.39
            2014-12-02  (null)  2776.8
            2015-11-13  1       (null)
            2015-11-16  1       (null)
            2015-12-01  91      (null)
            2015-12-02  21      (null)

我不明白指定Outside的日期parallelperiod range如何返回值?

  

编辑预期输出

我期望输出的结果是:

                    Quantity    TotalPrice      Contribution margin     ProfitMargin
      2013-11-17    4           5               13                      23 %
      2013-11-18    4           5               15                      25 %
      .             .           .               .                       .
      .             .           .               .                       .
      .             .           .               .                       .
      2013-11-30    1           100             80                      80 %
      2014-11-17    1           100             80                      80 %
      2014-11-18    1           100             80                      80 %
      .             .           .               .                       .
      .             .           .               .                       .
      .             .           .               .                       .
      2014-11-30    1           100             80                      80 %

(其中数值是虚拟值,可能不会“逻辑地”加起来)

2 个答案:

答案 0 :(得分:1)

它将在1年前设定的相同时段返回:

{
    ParallelPeriod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-20])
    :
    ParallelPeriod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-30])
}

为了在去年增加计算出的度量:

With
Member [Measures].[QuantityParallelPeriod] as
(
    ParallelPeriod([Dim Date].[Calender].[Year],1,[Dim Date].CurrentMember),
    [Measures].[Quantity]
)

完整代码必须如下所示:

With
Member [Measures].[QuantityParallelPeriod] as
(
    ParallelPeriod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].CurrentMember),
    [Measures].[Quantity]
)

Select
Non empty {[Measures].[Quantity],[Measures].[QuantityParallelPeriod]} on 0,
Non empty {[Dim Date].[Calender].[Date].[2014-11-20]:[Dim Date].[Calender].[Date].[2014-11-30]} on 1
From [DSV_FactStoreSales 1]
Where ([Dim Store2].[Store Key].&[1024])

答案 1 :(得分:0)

以下是工作解决方案的镜头。如果这不是您想要的最终工作查询的形状,请澄清,因为我没有在您的问题中发现这一点。

set terminal pngcairo size 1024,768 enhanced
set output 'output.png'
unset colorbox
set lmargin 0
set rmargin 0
set tmargin 0
set bmargin 0
unset tics
set pm3d map
set palette
set zero 1E-40
set cbrange[0:16]
set xrange[-1.7999999105699706625216549582546577:-1.7999999105620294592711161385523155]
set yrange[-2.941176470588235211202093999389572e-12:2.941176470588235211202093999389572e-12]
splot "splot.dat" using 1:2:3 with pm3d notitle
unset output

根据您澄清的预期结果,这是另一种形式:

WITH
MEMBER [Dim Date].[Calender].[All].[Prior Year] as
Aggregate(
 {
            parallelperiod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-17])
                :
            parallelperiod([Dim Date].[Calender].[Year],1,[Dim Date].[Calender].[Date].[2014-11-30])
 }
)
MEMBER [Dim Date].[Calender].[All].[Current Year] as
Aggregate(
 {
            [Dim Date].[Calender].[Date].[2014-11-17]
             :
             [Dim Date].[Calender].[Date].[2014-11-30]
 }
)

SELECT { 
    [Measures].[Quantity], [Measures].[Total Price]
   ,[Measures].[Contribution Margin], [Measures].[Profit Margin]
    } ON COLUMNS,
    {[Dim Date].[Calender].[All].[Prior Year],
     [Dim Date].[Calender].[All].[Current Year]}
    on rows
from [DSV_FactStoreSales 1] 
Where [Dim Store2].[Store Key].&[1024]