ssas - 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
我知道在第一个查询中它是用户层次结构,第二个查询是来自日期维度的属性层次结构,但我无法弄清楚哪些规则告诉以不同方式计算这些值。
如果有人可以解释背后的逻辑 - 这将非常有帮助。任何解释此逻辑的资源的链接也可能有所帮助。
顺便说一句:我创建了具有简单日期维度的简单多维数据集,它仅包含属性层次结构(日期、月份、年份),它仍然像第一个查询一样工作,所以不清楚它为什么会这样。
解决方案
我探索了这种行为的原因,我想我已经弄清楚了原因。下面的解释基于 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]}
推荐阅读
- java - 如何在 Java 中获取类的 TypeTag
- c# - 如何加快二进制读/写
- jquery - jquery datatables 不更新数据
- java - 使用自定义 JComponent 的 ComboBoxEditor 接口,并允许编辑和显示列表
- r - 如何在 R 中编写代码来对相似行值的列值进行排序?
- python - scrapy.core.engine DEBUG: 爬取 (200) Scrapy 框架
- javascript - Firestore v:5.5.6 | 无法读取未定义的属性“doc”
- angular - 扩展现有的 Angular/Typescript 接口
- php - 不确定如何在使用 PHP 的查询中测试变量是否存在
- javascript - GeckoFx 禁用 html 的 window.print