MDX是多维数据查询语言,类似于SQL,它的基本语法如下:
SELECT SET ON COLUMNS,SET ON ROWSFROM CUBEWHERE TUPLE
对SET、TUPLE、CUBE、成员的定义,可以参考百度,有的文章对概念的解释很详细。
下面我列出常见的操作:
单行单列查询:
这个结果值就一个,比如查询某个班总共有多少人
SELECT
{[人数度量维度].[总人数]} ON COLUMNS,
{[班级维度].[三年一班] } ON ROWS
FROM CUBE_NAME
单行多列:
比如查询某个班男生和女生各有多少人
SELECT
{[人数度量维度].[男生人数],[人数度量维度].[女生人数]} ON COLUMNS,
{[班级维度].[三年一班]} ON ROWS
FROM CUBE_NAME
多行单列:
比如查询每个班级的总人数:
SELECT
{[人数度量维度].[总人数]} ON COLUMNS,
{[班级维度].children} ON ROWS
FROM CUBE_NAME
多行多列:
比如查询每个班级,男生和女生的人数:
SELECT
{[人数度量维度].[男生人数],[人数度量维度].[女生人数]} ON COLUMNS,
{[班级维度].children} ON ROWS
FROM CUBE_NAME
上面的行和列,都只有一层。
列只有一级,行有两级:
查询每个班级,男生和女生的平均成绩:
SELECT
{[成绩度量维度].[分数]} ON COLUMNS,
{[班级维度].children}*{[性别维度].children} ON ROWS
FROM CUBE_NAME
行和列都有两级:
查询每个班级,男生和女生的上个月平均成绩、本月平均成绩:
SELECT
{[月份维度].[上月],[月份维度].[本月]}*{[成绩度量维度].[分数]} ON COLUMNS,
{[班级维度].children}*{[性别维度].children} ON ROWS
FROM CUBE_NAME
对某个轴去零值:
查询各个班级的总吃到人数,如果人数为零,去除掉这个班级的数据:
SELECT
NON EMPTY {[迟到人数度量维度].[总人数]} ON COLUMNS,
{[班级维度].children} ON ROWS
FROM CUBE_NAME
获取某个维度的所有成员:
比如获取班级维度的所有成员,也就是所有班级:
WITH MEMBER [度量维度].[班级名称] AS [班级维度].currentMember.name
SELECT
{[度量维度].[班级名称]} ON COLUMNS,
{[班级维度].members} ON ROWS
FROM CUBE_NAME
获取直接下级成员:
不包含下级成员的下级成员,比如获取机构维度的所有成员,也就是所有班级:
WITH MEMBER [度量维度].[机构名称] AS [机构维度].currentMember.name
SELECT
{[度量维度].[机构名称]} ON COLUMNS,
{[机构维度].[某机构].children} ON ROWS
FROM CUBE_NAME
获取默认成员:
WITH MEMBER [度量维度].[班级名称] AS [班级维度].currentMember.name
SELECT
{[度量维度].[班级名称]} ON COLUMNS,
{[机构维度].defaultMember} ON ROWS
FROM CUBE_NAME
获取树形机构:
WITH MEMBER [度量维度].[机构名称] AS [机构维度].currentMember.properties('名称')MEMBER [度量维度].[机构编码] AS [机构维度].currentMember.nameMEMBER [度量维度].[父机构编码] AS [机构维度].currentMember.parent.nameSELECT {[度量维度].[机构编码],[度量维度].[机构名称],[度量维度].[父机构编码]} ON COLUMNS,{[产品].members} ON ROWS FROM CUBE_NAME
这个查出来的是所有的集合,然后使用代码,两层循环,组成树形结构。
排除某些成员:
比如就是不让某机构出现在结果中
WITH MEMBER [度量维度].[机构名称] AS [机构维度].currentMember.name
SELECT
{[度量维度].[机构名称]}
ON COLUMNS,
{EXCEPT([机构维度].MEMBERS,{[机构维度].[某机构]})} ON ROWS
FROM CUBE_NAME
MDX一方面是学习它的查询语法,另一方面是要学会组装它返回的结果,这也是一个需要动脑筋的地方。