2013-11-27 44 views
0

我遇到麻烦,要使用基于自定义MDX查询的仪表板设计器在PerformancePoint中正确显示折线图。对于PerformancePoint折线图的MDX查询

与去年同期的6个月相比,我们试图展示当年的最后6个月。我写了查询,并返回了我们期望的数据。

SELECT NONEMPTY([Invoice Date].[Fiscal Week of Year].[Fiscal Week of Year]) 
       ON COLUMNS 
     ,NONEMPTY({[Invoice Date].[Hierarchy].[Fiscal Year] 
         * [Measures].[Amount]}) ON ROWS 
FROM [Sales] 

这将返回正确的数据。

我们创建折线图来显示数据。我们在y轴和年份周获得[金额](以美元计)。本周的本周基本上只是数字,因此当前的星期数是22(因为我们使用非日历会计年度)。然后我们有一个以年为基础的时间序列,这使得我们可以查看今年的第22周的数字与上一年的第22周的数据。

我们的问题是最近6个月穿越了一年的“边界”。正因为如此,我们的x轴没有“适当”的时间顺序。我们的底轴看起来像(我已经简化了几周):

1 | 2 | 3 | ... | 20 | 21 | 22 | 48 | 49 | 50 | 51 | 52 |

通知22和48间的跳跃这是正确的数值按时间顺序然而这条线图表应该是:

48 | 49 | 50 | 51 | 52 | 1 | 2 | 3 | ... | 20 | 21 | 22 |

我知道为什么会发生这种情况。年度财政周不属于我们的[发票日期]层次结构。

我们的层次是 会计年度=>财季=>会计月=>财政日期

所以我们定的是和周逐层增加

会计年度=>财季=>财政一个月=>财政周年度=>财政日期

而且新MDX查询看起来像:

SELECT NONEMPTY([Invoice Date].[Hierarchy].[Fiscal Week of Year]) 
       ON COLUMNS 
     ,NONEMPTY({[Invoice Date].[Fiscal Year].[Fiscal Year] 
         * [Measures].[Amount]}) ON ROWS 
FROM [Sales] 

嗯,这我们的固定这类问题因为现在年的周有上下文到何年第22周属于...但是这提出了一个不同的问题

因为新的背景下我们的图表现在不重叠的两个不同的时间序列,而是介绍他们背到后面,因为它们不共享一个简单的数字了,他们现在已经年+周(即使图表只显示周数)

所以图表现在看起来像下面

48 | 49 | 50 | 51 | 52 | 1 | 2 | 3 | ... | 20 | 21 | 22 | 48 | 49 | 50 | 51 | 52 | 1 | 2 | 3 | ... | 20 | 21 | 22 |

注意排序是如何正确的时间顺序但两年价值星期,现在出来沿x轴并排侧。

希望这篇冗长的解释有助于解释这个问题。这似乎是我们可以有“错误”之类的重叠时间序列,或者我们可以用几个星期的正确排序,但失去了一年来比较一年的能力。

我想要的是让我们获得正确的排序,所以:

48 | 49 | 50 | 51 | 52 | 1 | 2 | 3 | ... | 20 | 21 | 22 |

但仍然可以有2个不同年相互重叠。

或者换句话说,我希望Year of Week可以根据年份进行排序,但在返回数据时要“忘记”上下文,以便折线图可以让数周重叠。我很难理解如何解决这个问题。

+0

不是真的回答你的问题,而是根据内置图表的使用经验,任何时候想要控制x轴和y轴,最好使用SSRS或Excel,然后将这些报告与PPS仪表板集成。 –

+0

你如何选择你想在图表中显示的周?我在'SELECT'语句中看不到这个(可能是参数化的)条件。 – FrankPl

+0

@OlaEkdahl客户要求...但你知道我会说:) – Jeremy

回答

0

好吧,我有一个答案的问题。下面的MDX查询将返回的行[金额]与财政年和每列将是新年的一周。按照时间顺序排列周数,“年度周”将“排序”。这真的是一个可怕的描述,更好地看到它。

WITH SET [Weeks] AS 
EXTRACT([Invoice Date].[Dashboard Hierarchy].[Fiscal Week of Year], [Invoice Date].[Dashboard Hierarchy]) 
SET [Week of Year] AS 
INTERSECT(STRTOSET("{" + GENERATE( [Weeks] 
        ,"[Invoice Date].[Fiscal Week Of Year].&[" + [Weeks].CURRENT.NAME + "]" 
        ,",") + "}"), [Invoice Date].[Fiscal Week Of Year].MEMBERS) 
SELECT [Week of Year] ON COLUMNS 
    ,{([Invoice Date].[Fiscal Year].[Fiscal Year], [Measures].[Amount])} ON  ROWS 
FROM [Sales] 

当您运行查询,你会得到的结果类似下面的

MDX Query Results

注意,列51,52,53,1,2,3,它是正确的范围内我选择的数据(6个月至今)。所以在我的例子中,6个月前是当年的第51周。

还要注意,存在对51周重叠的2012年和2013年,如果你想在PerformancePoint内容折线图实际的比较这些数据点这是非常重要的数据。这是结果图表。

Line Chart

下面是该查询正在进行

WITH SET [Weeks] AS 
EXTRACT([Invoice Date].[Dashboard Hierarchy].[Fiscal Week of Year], [Invoice Date].[Dashboard Hierarchy]) 

这是使用Extract函数从日期层次结构中删除从年水平的财政周的所有成员。这将返回一个可用于下一个计算成员的集合。

INTERSECT(STRTOSET("{" + GENERATE( [Weeks] 
       ,"[Invoice Date].[Fiscal Week Of Year].&[" + [Weeks].CURRENT.NAME + "]" 
       ,",") + "}"), [Invoice Date].[Fiscal Week Of Year].MEMBERS) 

这里是大部分工作正在发生的地方。所以从“内部”开始并努力解决问题。

的生成函数生成基于计算出的构件的先前创建的周用逗号分隔的字符串。这个字符串实际上被构建为看起来像[财年每周]成员,它只包含几周,不是日期层次结构的一部分。这一点很重要,因为您不能将星期作为层次结构的一部分返回折线图,或者它不允许从2012年到2013年的第51周,因为它们是不同的成员而重叠。

然后使用StrToSet函数将新的逗号分隔的字符串转换为集合。

最后但并非最不重要,因为可能会有多个星期51例如,我相交的结果返回一个唯一的列表。

然后新年的新计算成员周的回报柱

我总是愿意就如何完成同样的事情的建议,但简单,因为它似乎是我创建了一个鲁贝戈德堡MDX查询,但我在整个互联网上找不到任何有关如何完成这件事的例子。

0

我看到了两种可能的解决方案:或者保留原来的“年减去几周”,并对它们应用一个订单,或者与第二种解决方案一起使用,只保留查询结果中的最新周数,并引用前几年的计算。

第一个解决方案将工作如下内容(我用的是微软的Adventure Works多维数据集,个月2007年11月2008年2月):

SELECT Extract(
     (
     [Date].[Calendar].[Month].&[2007]&[11] : [Date].[Calendar].[Month].&[2008]&[2] 
    ) 
     * [Date].[Calendar Week of Year].[Calendar Week of Year].members 
     , [Date].[Calendar Week of Year]) 
     on COLUMNS, 
     [Date].[Calendar].[Calendar Year].Members 
     on ROWS 
FROM [Adventure Works] 
WHERE [Measures].[Internet Sales Amount] 

第二个将工作如下:

WITH Member [Measures].[PrevYearAmount] as 
    (
    ParallelPeriod([Date].[Calendar Weeks].[Calendar Year], 1, [Date].[Calendar Weeks].CurrentMember), 
    [Measures].[Internet Sales Amount] 
    ) 
SELECT [Date].[Calendar Weeks].[Calendar Week].&[44]&[2007] : [Date].[Calendar Weeks].[Calendar Week].&[10]&[2008] 
     on COLUMNS, 
     { 
     [Measures].[Internet Sales Amount], 
     [Measures].[PrevYearAmount] 
     } 
     on ROWS 
FROM [Adventure Works] 

和,而不是WITH条款,你当然可以,如果你喜欢使用一个立方体计算的成员。

+0

不要忽视每个人,因为某些分区问题(高于我的薪酬等级),dba的立方体会因此而失效。我不认为我直到下周才看这个。 – Jeremy