CUBE函数已经介绍完了,但是感觉还有一些话题值得探讨。
主要就是MDX的使用。
在关于Cube函数的文章中,我们了解到Excel中对多维数据集和数据模型的访问实际使用的是MDX。尽管我们仅仅只是了解了一点皮毛(set和tuple的概念),就已经可以将CUBESET函数的威力扩充了数十倍不止,原来困难到不能完成的问题现在可以轻松解决了。
那么?学习更多一点MDX呢?
有位朋友在前面的文章中留言:
由于透视表结构的限制,试图通过MDX自定义表头,但苦于搞不懂MDX的语法,网上也搜不到相关内容,一直被这个问题困在原地。现在终于看到李老师讲解这方面的知识了,真是太棒了
其实,这也是很多人的困扰。
我们数据分析的工具多么先进,大部分场景中我们用来展示数据分析结果的平台始终是Excel。甚至,我们还会在Excel中进行更多细节的分析。
但是,我们的手段不多,无论数据在分析服务中,数据库中,还是数据模型以及Power BI数据集中,几乎只有数据透视表一种手段。而数据透视表本身就有很多限制。
当然,现在我们还有CUBE函数,但是正如我们之前介绍的那样,CUBE函数实际上说的是MDX语言,要想用好CUBE函数,学点MDX语言还是很有帮助的。
而且,我们还可以直接使用MDX查询将结果放在Excel的表格中。显然,这种做法在很大程度上可以解决前面所述的获取数据集中的结果的问题。
因此,我们还是有必要学一点MDX的。
就将这篇文章作为一个新的系列的开始吧。不过需要说明的是,这个系列是前面的朋友留言触发的新的想法,本身并没有系统的设计,更新速度不一定会很快,还请各位见谅。
在Excel中可以使用表格展示MDX查询结果,不过这个做法我们留到下次去介绍。今天我们先初步认识一下MDX查询吧。
我们需要使用一个插件:
DAX Studio。
之前我们介绍过这个插件,需要的朋友可以看这篇文章。
这个插件是学习和研究数据模型以及DAX的工具,我们写的DAX代码可以在这个工具中直接执行并看到结果。
数据模型本身是说DAX语言的,同时,数据模型也可以说MDX语言。
而DAX Studio插件也支持MDX语言。
这是启动DAX Studio之后的界面,浅红色的地方就是写DAX代码或者MDX代码的地方。
下面是一个简单的MDX查询:
SELECT
{[Measures].[以下项目的总和:SalesQuantity]}
ON COLUMNS,
{[Calendar].[Year].[All].[2011]
,[Calendar].[Year].[All].[2012]
,[Calendar].[Year].[All].[2012]}
ON ROWS
FROM [Model]
一个MDX查询总是包含一个SELECT子句。其中,你可以定义定义两个轴:行和列。(当然可以只有行或者列),行或者列通过关键字:ON COLUMNS以及ON ROWS定义。而在行或者列上放的内容就是集合set(不了解的可以看前面的相关文章,例如这篇文章)。
当然,一个MDX查询还需要一个FROM子句,表示从哪一个数据集中查询数据。因为我们是集中在Excel数据模型中操作,所以这个的来源只有一个:[Model]。
这个查询的意思就是:
从数据模型中查询2011,2012,2013年的销量合计,年份放在行上,销量合计放在列上。
很显然,这就是一个透视表的定义!!!
在DAX Studio中运行这个查询,结果如下:
行列调换一下位置:
SELECT
{[Measures].[以下项目的总和:SalesQuantity]}
ON ROWS,
{[Calendar].[Year].[All].[2010]
,[Calendar].[Year].[All].[2011]
,[Calendar].[Year].[All].[2012]}
ON COLUMNS
FROM [Model]
结果就变了:
当然,我们可以使用元组:
SELECT
{[Measures].[以下项目的总和:SalesQuantity]}
ON COLUMNS,
{
([Product].[Manufacturer].&[A. Datum Corporation],
[Calendar].[Year].&[2012]),
([Product].[Manufacturer].&[Fabrikam, Inc.],
[Calendar].[Year].&[2013]),
([Product].[Manufacturer].&[Proseware, Inc.],
[Calendar].[Year].&[2014])
}
ON ROWS
结果如下:
上面我们用了两个简单的MDX查询例子,目的是让大家了解MDX查询的语法结构。想深入了解的话,还需要后续的学习。
这里介绍一个很好的学习MDX查询的方法:
跟数据透视表学习MDX。
前提是你先创建一个超级透视表:
然后,在Excel中按Alt + F11,打开VBA编辑窗口,并在其中插入一个模块,然后输入代码:
Sub t()
Dim sh As Worksheet
Set sh = Sheet6
Dim pv As PivotTable
Set pv = sh.PivotTables(1)
Debug.Print pv.MDX
End Sub
按F5执行这段代码,就可以得到一个结果,显示在立即窗口中:
如果你的VBA界面中没有立即窗口,就在视图菜单中调出来:
看看这里的返回结果:
SELECT
NON EMPTY
Hierarchize(
{DrilldownLevel({[Calendar].[QuarterOfYear].[All]},
,
,
INCLUDE_CALC_MEMBERS)}
)
DIMENSION PROPERTIES PARENT_UNIQUE_NAME,
MEMBER_VALUE,HIERARCHY_UNIQUE_NAME
ON COLUMNS ,
NON EMPTY
Hierarchize(
DrilldownMember(
CrossJoin(
{[Geography].[ContinentName].[All],
[Geography].[ContinentName].[ContinentName].AllMembers},
{([Calendar].[Year].[All])}
),
[Geography].[ContinentName].[ContinentName].AllMembers,
[Calendar].[Year]
)
)
DIMENSION PROPERTIES PARENT_UNIQUE_NAME,
MEMBER_VALUE,HIERARCHY_UNIQUE_NAME
ON ROWS
FROM [Model]
WHERE ([Measures].[以下项目的总和:SalesQuantity]) CELL PROPERTIES VALUE, FORMAT_STRING, LANGUAGE, BACK_COLOR, FORE_COLOR, FONT_FLAGS
对照透视表,详细你可以明白这个查询在干什么!
详细解释请看视频
详情咨询客服(底部菜单-知识库-客服)
Excel+Power Query+Power Pivot+Power BI
自定义函数 底部菜单:知识库->自定义函数
面授培训 底部菜单:培训学习->面授培训
Excel企业应用 底部菜单:企业应用
发表评论