0

我无法使用基于自定义 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 轴和一年中的第几周得到 [Amount](以美元为单位)。一年中的一周基本上只是数字,所以当前的周数是 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 个不同的年份相互重叠。

或者换一种说法,我希望一年中的一周根据年份进行排序,然后在返回数据时“忘记”该上下文,以便折线图允许周数按数字重叠。我很困惑如何解决这个问题。

4

2 回答 2

0

我看到了两种可能的解决方案:要么保留原来的“年少周”,然后对它们应用订单,要么使用第二种解决方案,只保留查询结果中的最新周并在计算中引用前几年的周。

第一个解决方案的工作方式如下(我使用了 Microsoft 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并且,如果您愿意,当然可以使用多维数据集计算成员来代替子句。

于 2013-12-03T14:45:13.260 回答
0

好的,我有这个问题的答案。下面的 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]

运行查询时,您将获得如下结果

MDX 查询结果

请注意,这些列是 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 函数从 Date 层次结构中移除 Fiscal Week of Year 级别的所有成员。这将返回一个可用于下一个计算成员的集合。

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

大部分工作都在这里进行。所以从“内部”开始,努力走出去。

Generate 函数根据之前创建的 Weeks 计算成员生成逗号分隔的字符串。这个字符串实际上被构建为看起来像 [Fiscal Week of Year] 成员,它只包含周而不是日期层次结构的一部分。这很重要,因为您不能将周作为层次结构的一部分返回到折线图,或者它不允许第 51 周(例如 2012 年和 2013 年)重叠,因为它们是不同的成员。

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

最后但并非最不重要的一点是,例如,可能有多个第 51 周,我将结果相交以返回一个唯一列表。

然后在列上返回新计算的成员一周

我总是乐于接受有关如何完成同一件事但更简单的建议,因为它似乎确实创建了一个 Rube Goldberg MDX 查询,但我在整个互联网上找不到任何关于如何完成这件事的示例。

于 2013-12-10T22:31:17.223 回答