我最近发布了一个关于如何让ALL标签出现在SSRS报告中的问题."whytheq"非常友好地发布一个有效的例子.下面是具有附加维度的MDX,如果我取消注释它会给我一个错误:
查询(8,5)函数中指定的两个集具有不同的维度.
WITH MEMBER [Due Date].[Calendar Month].[All].[YTD] AS [Due Date].[Calendar Month].[All] SELECT NON EMPTY {[Measures].[Freight]} ON COLUMNS ,NON EMPTY { //[Product].[Color].[Color].MEMBERS* [Due Date].[Calendar Month].[All].[YTD], [Due Date].[Calendar Month].[Calendar Month].MEMBERS } ON ROWS FROM [Adventure Works Cube];
我知道我在.MEMBERS级别有一个Dimension,我还添加了.[YTD]维度.
我确实注意到,如果我注释掉.[YTD]并取消注释[Product]维度,这可行但我必须使用*而不是像这样的逗号.
[Product].[Color].[Color].MEMBERS* //[Due Date].[Calendar Month].[All].[YTD], [Due Date].[Calendar Month].[Calendar Month].MEMBERS
是否可以将产品维度包含在YTD和Calendar Month.MEMEBERS的行中?
Greg对你的问题的回答很好,我只是想向你展示你的查询的细节,所以也许你可以更好地理解你如何使用MDX查询和立方体的结构来产生你想要的结果.
首先,这是大多数MDX查询的基本结构:
SELECT Set_Expression ON COLUMNS , Set_Expression ON ROWS FROM CUBE;
(MDX还有一些,但这可能是80-90%.)
一组表达式是返回一组的表达-所以你可以看到,明白什么是集以及如何建立它的非常重要的有效返回表达权集.
那么首先,什么是一套呢?甲组是-drum滚涂....一组元组1.但不仅仅是任何元组 - 只有具有相同维度层次结构(也称为维度)的元组.让我们看一下潜在集合表达式的一些例子,我会告诉你它们是否有效.
有一个元组的集合?有效.
{ Product.Product.Laptop }
一个包含来自同一维度层次结构的两个元组的集合?有效.
{ Product.Product.Laptop , Product.Product.Desktop }
一个包含两个来自相同维度层次结构但不同级别的元组的集合?有效.
{ Date.DateHierarchy.Year.2008 , Date.DateHierarchy.Quarter.2009Q1 }
一个包含来自相同维度的两个元组但是不同层次结构的集合?无效.
__PRE__
为什么这个无效?因为这两个元组具有不同的维度.如果考虑回到"立方体"的字面隐喻,每个维度层次结构都是"面",每个元组是沿着构成其维度的面的立方体切片(以及任何不属于其的维度层次结构)元组的显式维度在执行时被视为隐式"所有成员")因此,为了将两个或多个元组组合成一个集合 - 所以你可以在一个切片中从多维数据集中提取它们 - 它们必须都来自同一个一组面孔 - 相同的维度.
一个具有元组和set函数的集合(一个返回一组元组的MDX函数)来自同一维度层次结构?有效.
{ Product.Product.[Laptop] , Product.Category.[Hardware] }
具有来自相同维度层次结构的两个集合函数的集合?有效
{ Tail ( Order ( Product.Product.Members, Measures.Profit, BASC ), 5), Product.Product.All }
一组有两个维度的元组?有效 但是!你必须在元组周围加上括号.(你可以用一个维度将元组括在元组周围,但这不是必需的.)
{ Subset(Product.Product.Members,0,5), Subset(Product.Product,Members,6,5) }
一组有两个元组,每个元组在相同的层级上有两个维度?有效
{ ( Product.Product.Laptop, Date.Year.2015 ) }
(注意,成员不必完全相同,只需要层次结构.希望这是你认识到"维度"意味着什么的点.)
一组有两个元组,每个元组在相同的层级上有两个维度但在元组中的顺序不同?无效
__PRE__
(与SQL中的UNION相比 - 您必须具有一致的排序,因此MDX可以构建设置以执行其他任务,例如在查询轴上正确嵌套元组的每个成员.)
最后,如果我们想将来自不同维度层次结构的两个集合组合成一个集合,我们使用方便的花花公子CrossJoin函数:
{ ( Product.Product.Laptop, Date.Year.2015 ), ( Product.Product.Tablet, Date.Year.2013 ) }
正如您所发现的,您还可以使用星号(*)来执行两组的交叉连接
{ ( Product.Product.Laptop, Date.Year.2015 ), ( Date.Year.2013, Product.Product.Tablet ) }
现在了解这里发生的事情非常重要.我之前说过"组合集",但正如您在所有示例中看到的那样,您不能将具有不同维度的各组元组一起放入一个集合中.
那么CrossJoin在做什么呢?
好吧,给一个CrossJoin
CrossJoin ( { Product.Product.Laptop } , Date.Year.Members )
结果集的元组维度为(A, B)
.
回想一下我们的CrossJoin示例,我们的左侧只有一个元组,其维数是(Product.Product)
.我们的右侧有许多元组(Date.Year
层次结构的每个成员),其维数为(Date.Year)
.所以我们的最后一组元组将具有维数(Product.Product, Date.Year)
.
所以说我们每年从2010年到2015年都在我们的立方体中,我们的最终设置将是6元组
Product.Product.Laptop * Date.Year.Members
所以你可以在理论上为这个集合添加更多元组,只要它们具有相同维度的simpatico - 比方说, (Product.Product.Tablet, Date.Year.2013)
所以这也是一个VALID集表达式:
{Set With Tuple Dimensionality (A)} * {Set with Tuple Dimensionality (B)}
所以现在回到你的问题,如果我们取消你破坏的代码行,我们看到你已经得到了
{ ( Product.Product.Laptop, Date.Year.2010), ( Product.Product.Laptop, Date.Year.2011), ( Product.Product.Laptop, Date.Year.2012), ( Product.Product.Laptop, Date.Year.2013), ( Product.Product.Laptop, Date.Year.2014), ( Product.Product.Laptop, Date.Year.2015) }
所以,在这里你有一组元组
{ Product.Product.Laptop * Date.Year.Members, (Product.Product.Tablet, Date.Year.2013)` }
其元组的维数为
{ [Product].[Color].[Color].MEMBERS * [Due Date].[Calendar Month].[All].[YTD], [Due Date].[Calendar Month].[Calendar Month].MEMBERS }
然后你试图将另一组元组添加到这个集合中
[Product].[Color].[Color].MEMBERS * [Due Date].[Calendar Month].[All].[YTD]
其元组的维数为
(Product.Color, Due Date.Calendar Month)
现在你明白了你得到的错误信息吗?
这让我想到为什么我在凌晨1点写了这么长的帖子:你的错误是从根本上误解了MDX中集合概念的错误,而不仅仅是语法错误.
显然,你想要你的最终集合的元组层次结构
[Due Date].[Calendar Month].[Calendar Month].MEMBERS
再次,格雷格的答案实现了这一点.所以我希望我的帖子能解释Greg的答案是如何实现的!
此外,这里有两种替代语法方法可以在COLUMNS轴上实现相同的设置结果:
(Due Date.Calendar Month)
和
(Product.Color, Due Date.Calendar Month)
基本上,(set, set)
语法也执行交叉连接,NONEMPTY(set1, set2)
函数也是如此.正因为如此,您可以看到有多种语法方法可以实现相同的概念.
快速复习元组:多维数据集中的每个单元格代表一组唯一的维度层次结构成员.甲元组是一组构成的一组单元(或维度层次结构构件的坐标空间)中的立方体.(注意:任何未在元组表达式中显式命名的维度层次结构都使用其默认成员,如果未在SSAS多维数据集模型中显式设置,则为All成员.)
因此,元组表达式(Product.Product.Laptop)
指向Product.Product
维度层次结构成员所在的多维数据集中的单元格Product.Product.Laptop
,对于所有其他维度层次结构,该成员是默认成员(如果它是All成员,则多维数据集基本上不执行任何工作,因为在该维度层次结构上不需要切片.)
在下图中,您可以看到元组表达式如何(Time.[2nd half], Source.nonground.air)
应用于多维数据集以生成其坐标空间.
好的,回到顶部.