这是两个简单的查询,显示按日期过滤的月份级别的数据。
在第一个查询中,我使用“ 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
这两个日期的总价值等于第二个查询者的结果-$ 54,468.46
我了解在Date维度中,第一个查询是用户层次结构,第二个查询是属性层次结构,但是我无法弄清楚哪个规则可以不同地计算这些值。
如果有人可以在背后解释这种逻辑-这将非常有帮助。任何解释该逻辑的资源的链接也可能有帮助。
顺便说一句:我创建了具有简单Date维度的简单多维数据集,该多维数据集仅由属性层次结构(日期,月份,年份)组成,并且仍然像在第一个查询中一样工作,因此尚不清楚其行为为何。
答案 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]
请注意,日历年,学期和季度都显示非默认值。但是我们从未使用过它们。这表明用户层次结构已完成到基础属性层次结构的转换。现在看看日历,它仍然显示“所有期间”。既然被忽略了。 现在,如果您将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]}
请注意,这次使用的是单个成员的分辨率,而不是用户层次结构的分辨率。现在,此行为可能是由于一个翻译给出了“所有期间”,而另一个翻译给出了一个成员,因此该成员获胜了。
为了进一步确认这一点,我对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]}