Sharepoint 2010 PerformancePoint折线图的MDX查询

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

使用基于自定义MDX查询的仪表板设计器在PerformancePoint中获取正确的折线图时遇到问题

我们试图显示今年最后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个不同的年份相互重叠


或者换一种方式,我希望一年中的一周根据年份进行排序,但也希望在返回数据时“忘记”上下文,以便折线图允许周数按数字重叠。我很难理解如何做到这一点。

我看到了两种可能的解决方案:要么保留最初的“无年份周”,并对其应用订单,要么使用第二种解决方案,只保留查询结果中最新的周数,并在计算中引用前几年的周数

第一个解决方案的工作原理如下(我使用了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)