AdventureWorks日期维度根据所选层次结构显示不同的结果

时间:2019-01-18 16:41:39

标签: ssas mdx

这是两个简单的查询,显示按日期过滤的月份级别的数据。

在第一个查询中,我使用“ Date.Calendar”用户层次结构的月份级别。

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount] } ON 0,
    NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   {[Date].[Date].&[20130105]:[Date].[Date].&[20130106]}

又收到-2013年1月-> 857,689.91美元 Results

在第二个查询中,我使用“ Date.Month of Year”属性层次结构。

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount]} ON 0,
    NON EMPTY { [Date].[Month of Year].&[1] } ON 1
FROM    [Adventure Works]
WHERE   { [Date].[Date].&[20130105] : [Date].[Date].&[20130106] }

收到-1月-> $ 54,468.46 Results

我不知道为什么这两个查询显示不同的结果。如果使用相同的尺寸,并且在最可能的级别上过滤/切片数据。

以下是每个日期的值。

SELECT 
    NON EMPTY { [Measures].[Internet Sales Amount]} ON 0,
    NON EMPTY { [Date].[Calendar].[Date] } ON 1
FROM    [Adventure Works]
WHERE   { [Date].[Date].&[20130105] : [Date].[Date].&[20130106] }

2013年1月5日$ 32,681.44

2013年1月6日$ 21,787.02

Result

这两个日期的总价值等于第二个查询者的结果-$ 54,468.46

我了解在Date维度中,第一个查询是用户层次结构,第二个查询是属性层次结构,但是我无法弄清楚哪个规则可以不同地计算这些值。

如果有人可以在背后解释这种逻辑-这将非常有帮助。任何解释该逻辑的资源的链接也可能有帮助。

顺便说一句:我创建了具有简单Date维度的简单多维数据集,该多维数据集仅由属性层次结构(日期,月份,年份)组成,并且仍然像在第一个查询中一样工作,因此尚不清楚其行为为何。

1 个答案:

答案 0 :(得分:0)

我探究了这种行为的原因,并且我想我已经找到了原因。以下说明基于《 SQL SERVER 2008 MDX分步指南》第51-58页(特别是避免引用冲突)。

您的问题是典型的参考冲突问题。在MDX中,一个给定的元组不能多次使用层次结构,但是如果您使用的是USER层次结构及其底层的属性层次结构,则实际上绕过了此检查。这就是您查询中发生的事情

在您的第一个查询中,您正在使用用户层次结构

  

[Date]。[Calendar]。[Month]。&[2013]&1

在MDX中,用户层次结构转换为属性层次结构。在您的第一个查询

  

选择   NON EMPTY {[Measures .. [Internet Sales Amount]} ON 0,   非空{[Date]。[Calendar]。[Month]。&[2013]&1}} 1   在[冒险工作]上
  {[Date]。[Date]。&[20130105]:[Date]。[Date]。&[20130106]}

您正在使用用户层次结构“ [日期]。[日历]。[月]。&[2013]&1”,其最后一级具有“ [日期]。[日期]”。然后在where子句中使用相同的“ [Date]。[Date]”属性层次结构进行过滤。由于在USER层次结构中您尚未使用叶级,因此已经做了部分地址,因此解决了成员及其祖先的问题。翻译中所有后代都将被忽略。看看下面的查询(这是基于您的第一个查询,我有意删除了where子句)。

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works] 

结果。 enter image description here

请注意,日历年,学期和季度都显示非默认值。但是我们从未使用过它们。这表明用户层次结构已完成到基础属性层次结构的转换。现在看看日历,它仍然显示“所有期间”。既然被忽略了。 现在,如果您将where子句添加回去,则日期仍显示为“所有期间”,这有两个原因 1)由于在用户层次结构转换中被忽略, 2)您在哪里使用了范围。如果用行元组替换行轴元组,则该行仍将显示“所有期间”作为范围的基础。但是,解决该问题仅需两个日期。

基于此,在解决您的查询时,它对Date属性层次结构进行了两种转换,一种表示基于用户层次结构将其忽略,另一种提供了范围。这是由于冲突导致结果不正确的地方。

现在让我们考虑一下您之前在评论中给我的查询

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   {[Date].[Date].&[20130105]}

结果: enter image description here

请注意,这次使用的是单个成员的分辨率,而不是用户层次结构的分辨率。现在,此行为可能是由于一个翻译给出了“所有期间”,而另一个翻译给出了一个成员,因此该成员获胜了。

为了进一步确认这一点,我对AdventureWorks示例进行了更改。日期属性层次结构基于“简单日期”列。我将“简单日期”作为单独的属性公开并处理了我的多维数据集。

看看“简单日期”查询和结果。

with member [Measures].[CalendarYear] as [Date].[Calendar Year].currentmember.name
member [Measures].[CalendarSemester] as  [Date].[Calendar Semester of Year].currentmember.name
member [Measures].[CalendarQuater] as  [Date].[Calendar Quarter of Year].currentmember.name
member [Measures].[CalendarMonth] as  [Date].[Month of Year].currentmember.name
member [Measures].[CalendarDate] as [Date].[Date].currentmember.name
SELECT 
NON EMPTY { [Measures].[Internet Sales Amount] ,[Measures].[CalendarYear],[Measures].[CalendarSemester],[Measures].[CalendarQuater],[Measures].[CalendarMonth],[Measures].[CalendarDate]} ON 0,
NON EMPTY { [Date].[Calendar].[Month].&[2013]&[1] } ON 1
FROM    [Adventure Works]
WHERE   
--{[Date].[Date].&[20130105]}
{[Date].[Simple Date].&[20130105]:[Date].[Simple Date].&[20130106]}

结果:enter image description here