首页 > 解决方案 > AdventureWorks 日期维度根据所选层次结构显示不同的结果

问题描述

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

在第一个查询中,我使用“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 美元的 结果

在第二个查询中,我使用“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 美元的 结果

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

以下是每个日期的值。

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

我知道在第一个查询中它是用户层次结构,第二个查询是来自日期维度的属性层次结构,但我无法弄清楚哪些规则告诉以不同方式计算这些值。

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

顺便说一句:我创建了具有简单日期维度的简单多维数据集,它仅包含属性层次结构(日期、月份、年份),它仍然像第一个查询一样工作,所以不清楚它为什么会这样。

标签: ssasmdx

解决方案


我探索了这种行为的原因,我想我已经弄清楚了原因。下面的解释基于 SQL SERVER 2008 MDX Step by Step 第 51-58 页(尤其是避免引用冲突)一书。

您的问题是典型的引用冲突问题。在 MDX 中,层次结构不能在给定元组中多次使用,但如果您使用 USER Hierarchy 及其下的 Attribute Hierarchy,则基本上绕过此检查。这就是您的查询中发生的事情

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

[日期].[日历].[月份].&[2013]& 1

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

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

您正在使用用户层次结构“[Date].[Calendar].[Month].&[2013]& 1 ”,其最后一级具有“[Date].[Date]”。然后在 where 子句中使用相同的“[Date].[Date]”属性层次结构进行过滤。由于在 USER Hierarchy 中您没有使用叶级别,因此您制作了部分地址,因此成员及其祖先被解析。翻译中忽略所有后代。看看下面的查询(这是基于您的第一个查询,我特意删除了您的 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)你在 where 中使用了一个范围。如果你用你的 where 元组替换你的行轴元组,它仍然会显示“All Period”作为一个范围的基础。然而,在解决它时只需要两个日期。

基于此,在解决您的查询时,它有两个日期属性层次结构的翻译,一个说基于用户层次结构忽略它,另一个提供了一个范围。这是由于冲突导致结果不正确的地方。

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

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]}

结果: 在此处输入图像描述

请注意,这次使用单个成员的解析而不是用户层次结构解析。现在这种行为可能是由于一个翻译是给“All Period”,而下一个是给一个成员,因此这个成员赢了。

为了进一步确认这一点,我对 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]}

结果:在此处输入图像描述


推荐阅读