Sharepoint 2010 PerformancePoint折线图的MDX查询
使用基于自定义MDX查询的仪表板设计器在PerformancePoint中获取正确的折线图时遇到问题 我们试图显示今年最后6个月与去年同期6个月的对比。我编写了查询,它返回我们期望的数据Sharepoint 2010 PerformancePoint折线图的MDX查询,sharepoint-2010,mdx,performancepoint,dashboard-designer,Sharepoint 2010,Mdx,Performancepoint,Dashboard Designer,使用基于自定义MDX查询的仪表板设计器在PerformancePoint中获取正确的折线图时遇到问题 我们试图显示今年最后6个月与去年同期6个月的对比。我编写了查询,它返回我们期望的数据 SELECT NONEMPTY([Invoice Date].[Fiscal Week of Year].[Fiscal Week of Year]) ON COLUMNS ,NONEMPTY({[Invoice Date].[Hierarchy].[Fisc
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个不同的年份相互重叠
或者换一种方式,我希望一年中的一周根据年份进行排序,但也希望在返回数据时“忘记”上下文,以便折线图允许周数按数字重叠。我很难理解如何做到这一点。我看到了两种可能的解决方案:要么保留最初的“无年份周”,并对其应用订单,要么使用第二种解决方案,只保留查询结果中最新的周数,并在计算中引用前几年的周数 第一个解决方案的工作原理如下(我使用了Microsoft Adventure Works多维数据集,从2007年11月到2008年2月): 第二项工作如下:
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
子句。好的,我有一个问题的答案。下面的MDX查询将返回带有会计年度的[Amount],每一行和每一列都是一年中的一周。一年中的一周将按周的时间顺序进行“排序”。这真是一个可怕的描述,最好看一看
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]
当您运行查询时,您将得到如下结果
请注意,列是51、52、53、1、2、3,这对于我选择的数据范围(到目前为止6个月)是正确的。在我的例子中,6个月前是那一年的第51周
还请注意,2012年和2013年第51周的数据重叠。如果希望PerformancePoint内容中的折线图实际比较这些数据点,这一点很重要。这是结果图表
下面是查询正在执行的操作
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)
这里是大部分工作正在进行的地方。因此,从“内部”开始,努力走出困境
Generate函数将基于先前创建的成员生成逗号分隔的字符串。这个字符串实际上被构建成只包含周的[Fiscal Week of Year]成员,而不是日期层次结构的一部分。这一点很重要,因为您无法将周作为层次结构的一部分返回到折线图中,或者由于2012年和2013年的第51周是不同的成员,因此不允许重叠
然后使用stroset函数将新的逗号分隔字符串转换为一个集合
最后但并非最不重要的一点是,因为可能会有多个第51周,例如,我将相交结果以返回一个唯一的列表
然后在列中返回新计算的成员周
我总是乐于接受关于如何完成同样的事情但更简单的建议,因为看起来我确实创建了一个Rube Goldberg MDX查询,但我只是在整个互联网上找不到任何关于如何完成这件事情的例子。不是真的回答你的问题,而是从内置图表的经验来看,只要你想控制x轴和y轴,最好使用SSRS或Excel,然后将这些报告与PPS仪表板集成。你如何选择
INTERSECT(STRTOSET("{" + GENERATE( [Weeks]
,"[Invoice Date].[Fiscal Week Of Year].&[" + [Weeks].CURRENT.NAME + "]"
,",") + "}"), [Invoice Date].[Fiscal Week Of Year].MEMBERS)