MDX 数据操作 - SELECT

从指定的立方体获取数据。

Syntax

  
[ WITH <SELECT WITH clause>   
   [ , <SELECT WITH clause>...n ]   
]   
SELECT   
     [ *   
    | ( <SELECT query axis clause>   
                  [ , <SELECT query axis clause>,...n ]   
            )   
            ]  
FROM   
   <SELECT subcube clause>   
      [ <SELECT slicer axis clause> ]  
      [ <SELECT cell property list clause> ]  
  
<SELECT WITH clause> ::=  
     ( CELL CALCULATION <CREATE CELL CALCULATION body clause> )   
   | ( [ CALCULATED ] MEMBER <CREATE MEMBER body clause>)   
   | ( SET <CREATE SET body clause>)  
   | ( MEASURE = <measure body clause> )  
  
<SELECT query axis clause> ::=  
   [ NON EMPTY ] Set_Expression  
   [ <SELECT dimension property list clause> ]   
      ON   
            Integer_Expression   
       | AXIS(Integer)   
       | COLUMNS   
       | ROWS   
       | PAGES   
       | SECTIONS   
       | CHAPTERS   
  
<SELECT subcube clause> ::=  
      Cube_Name   
   | [NON VISUAL] (SELECT   
                  [ *   
       | ( <SELECT query axis clause> [ ,   
           <SELECT query axis clause>,...n ] )   
         ]   
            FROM   
         <SELECT subcube clause>   
         <SELECT slicer axis clause> )  
  
<SELECT slicer axis clause> ::=   
      WHERE Tuple_Expression  
  
<SELECT cell property list clause> ::=   
   [ CELL ] PROPERTIES CellProperty_Name   
      [ , CellProperty_Name,...n ]  
  
<SELECT dimension property list clause> ::=  
   [DIMENSION] PROPERTIES   
      (DimensionProperty_Name   
         [,DimensionProperty_Name,...n ] )   
    | (LevelProperty_Name   
         [, LevelProperty_Name,...n ] )   
    | (MemberProperty_Name   
         [, MemberProperty_Name,...n ] )  

Arguments

Set_Expression
一个有效的多维表达式(MDX)表达式,返回集合。

整数
介于 0 和 127 之间的整数。

Cube_Name
一个有效的字符串,提供一个立方体名。

Tuple_Expression
一个有效的多维表达式(MDX)表达式,返回元组。

CellProperty_Name
一个表示单元格属性的有效字符串。

DimensionProperty_Name
一个表示维度性质的有效字符串。

LevelProperty_Name
一个表示等级属性的有效字符串。

MemberProperty_Name
一个表示成员属性的有效字符串。

Remarks

表达式 <SELECT slicer axis clause> 必须包含与指定 <SELECT query axis clause> 表达式所引用的维度和层级结构不同的成员。

如果立方体中的某个属性在指定的 <SELECT query axis clause> 表达式和 <SELECT slicer axis clause> 值中被省略,该属性的默认成员会隐式添加到切片器轴上。

子选择语句中的非视觉选项允许你过滤成员,同时保留真实总数而非过滤后的总数。 这样你可以查询前十名销售额(个人/产品/地区),并获得所有被查询会员的真实销售总额,而不是前十名的总销售额。 更多信息请参见下方示例。

计算成员可以在连接打开时包含<在 SELECT 查询轴子句>中,使用 连接字符串 参数 subqueries=1;参见支持 XMLA 属性(XMLA)及ConnectionString参数使用。 示例中提到子选择中的计算成员。

Autoexists

当SELECT语句中使用该维度的两个或多个属性时,分析服务会评估这些属性的表达式,以确保这些属性的成员被适当限制以满足所有其他属性的标准。 例如,假设你正在使用 Geography 维度中的属性。 如果你有一个表达式返回城市属性中的所有成员,另一个表达式将国家属性的成员限制在欧洲所有国家/地区,那么城市成员只会被限制在属于欧洲国家/地区的城市。 分析服务的这一特性称为自存在(Autoexists),仅适用于同一维度的属性。 自动存在仅适用于同一维度中的属性,因为它尝试阻止其他属性表达式包含一个属性表达式中排除的维度记录。 自存在也可以理解为不同属性表达式在维度记录上的交集。 请参见以下示例:

//Obtain the Top 10 best reseller selling products by Name  
with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  

获取的结果集为:

模型名称 + 测量 经销商销售金额 折扣金额 PCT 折扣
Mountain-200 $14,356,699.36 $19,012.71 0.13%
Road-250 $9,377,457.68 $4,032.47 0.04%
Mountain-100 $8,568,958.27 $139,393.27 1.63%
Road-650 $7,442,141.81 $39,698.30 0.53%
Touring-1000 $6,723,794.29 $166,144.17 2.47%
Road-550-W $3,668,383.88 $1,901.97 0.05%
Road-350-W $3,665,932.31 $20,946.50 0.57%
HL 山地车架 $3,365,069.27 $174.11 0.01%
Road-150 $2,363,805.16 $0.00 0.00%
Touring-3000 $2,046,508.26 $79,582.15 3.89%

获取的产品集似乎与 Preferred10Products 相同;因此,验证 Preferred10Products 集:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  

根据以下结果,这两个集合(Top10SellingProducts,Preferred10Products)是一致的。

模型名称 + 测量 经销商销售金额 折扣金额 PCT 折扣
Mountain-200 $14,356,699.36 $19,012.71 0.13%
Road-250 $9,377,457.68 $4,032.47 0.04%
Mountain-100 $8,568,958.27 $139,393.27 1.63%
Road-650 $7,442,141.81 $39,698.30 0.53%
Touring-1000 $6,723,794.29 $166,144.17 2.47%
Road-550-W $3,668,383.88 $1,901.97 0.05%
Road-350-W $3,665,932.31 $20,946.50 0.57%
HL 山地车架 $3,365,069.27 $174.11 0.01%
Road-150 $2,363,805.16 $0.00 0.00%
Touring-3000 $2,046,508.26 $79,582.15 3.89%

在前面的例子中,我们创建了两个集合:一个作为计算表达式,另一个作为常数表达式。 这些例子展示了Autoexists的不同风格。

自存在可以对表达式施加深度或浅层。 默认设置是深度。 以下示例将说明深度 Autoexists 概念。 在本示例中,我们按 [Product].[Product Line] 属性筛选 Top10SellingProducts 以确定属于 [Mountain] 组的产品。 请注意,两个属性(切片器和轴)都属于同一维度 [Product]。

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
// Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

生成以下结果集:

模型名称 + 测量 经销商销售金额 折扣金额 PCT 折扣
Mountain-200 $14,356,699.36 $19,012.71 0.13%
Mountain-100 $8,568,958.27 $139,393.27 1.63%
HL 山地车架 $3,365,069.27 $174.11 0.01%
Mountain-300 $1,907,249.38 $876.95 0.05%
Mountain-500 $1,067,327.31 $17,266.09 1.62%
Mountain-400-W $592,450.05 $303.49 0.05%
LL 山地框架 $521,864.42 $252.41 0.05%
ML 山地车架-W $482,953.16 $206.95 0.04%
ML山地车架 $343,785.29 $161.82 0.05%
女子山地短裤 $260,304.09 $6,675.56 2.56%

在之前的结果中,我们有七个新成员进入Top10SellingProducts榜单,Mountain-200、Mountain-100和HL Mountain Frame已跃居榜首。 在之前的结果集中,这三个值被夹杂在中间

这个过程被称为 Deep Autoexists,因为评估 Top10SellingProducts 集合是为了满足查询的切片条件。 Deep Autoexists 表示,在应用切片器表达式、轴中的子选择表达式等后,将计算所有表达式以满足最深的空间。

但是,人们可能希望能够对 Top10SellingProducts 进行分析,这相当于 Preferred10Products,如以下示例所示:

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
set Preferred10Products as '  
{[Product].[Model Name].&[Mountain-200],  
[Product].[Model Name].&[Road-250],  
[Product].[Model Name].&[Mountain-100],  
[Product].[Model Name].&[Road-650],  
[Product].[Model Name].&[Touring-1000],  
[Product].[Model Name].&[Road-550-W],  
[Product].[Model Name].&[Road-350-W],  
[Product].[Model Name].&[HL Mountain Frame],  
[Product].[Model Name].&[Road-150],  
[Product].[Model Name].&[Touring-3000]  
}'  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Preferred10Products on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

生成以下结果集:

模型名称 + 测量 经销商销售金额 折扣金额 PCT 折扣
Mountain-200 $14,356,699.36 $19,012.71 0.13%
Mountain-100 $8,568,958.27 $139,393.27 1.63%
HL 山地车架 $3,365,069.27 $174.11 0.01%

在上述结果中,切片的结果仅包含 Preferred10Products 中属于 [Product].[产品线] 中的 [Mountain] 组的产品;这是预期的结果,因为 Preferred10Products 是一个常量表达式。

该结果集也被理解为浅层自存在。 这是因为表达式是在切片子句之前计算的。 在前面的示例中,表达式是用于说明目的的常量表达式,用于介绍概念。

可以在会话级别使用 Autoexists 连接字符串属性修改 Autoexists 功能。 以下示例首先打开一个新会话并将 Autoexists=3 属性添加到连接字符串。 必须打开一个新连接才能执行该示例。 使用“自动存在”设置建立连接后,该连接将一直有效,直到该连接完成。

with member [Measures].[PCT Discount] AS '[Measures].[Discount Amount]/[Measures].[Reseller Sales Amount]', FORMAT_STRING = 'Percent'  
set Top10SellingProducts as 'topcount([Product].[Model Name].children, 10, [Measures].[Reseller Sales Amount])'  
//Preferred10Products set removed for clarity  
select {[Measures].[Reseller Sales Amount], [Measures].[Discount Amount], [Measures].[PCT Discount]} on 0,  
Top10SellingProducts on 1  
from [Adventure Works]  
where [Product].[Product Line].[Mountain]  

以下结果集现在显示了 Autoexists 的浅表行为。

模型名称 + 测量 经销商销售金额 折扣金额 PCT 折扣
Mountain-200 $14,356,699.36 $19,012.71 0.13%
Mountain-100 $8,568,958.27 $139,393.27 1.63%
HL 山地车架 $3,365,069.27 $174.11 0.01%

可以使用连接字符串中的 AUTOEXISTS=[1|2|3] 参数修改 Autoexists 行为;请参阅 支持的 XMLA 属性(XMLA) 和 ConnectionString 参数用法。

示例

以下示例返回了2003年历年前八个月内成员的总和 Measures.[Order Quantity] ,这些时间包含在该 Date 维度中,取自 Adventure Works 立方体。

WITH MEMBER [Date].[Calendar].[First8Months2003] AS  
    Aggregate(  
        PeriodsToDate(  
            [Date].[Calendar].[Calendar Year],   
            [Date].[Calendar].[Month].[August 2003]  
        )  
    )  
SELECT   
    [Date].[Calendar].[First8Months2003] ON COLUMNS,  
    [Product].[Category].Children ON ROWS  
FROM  
    [Adventure Works]  
WHERE  
    [Measures].[Order Quantity]  

为了理解 非可视化, 以下示例是查询[Adventure Works],以获取表格中的[经销商销售金额]数字,其中产品类别为列,经销商业务类型为行。 请注意,总计数据涵盖了产品和经销商。

以下是SELECT声明:

select [Category].members on 0,  
[Business Type].members on 1  
from [Adventure Works]  
where [Measures].[Reseller Sales Amount]  

生成以下结果:

业务类型+类别 所有产品 配件 Bikes Clothing Components
所有经销商 $80,450,596.98 $571,297.93 $66,302,381.56 $1,777,840.84 $11,799,076.66
专业自行车店 $6,756,166.18 $65,125.48 $6,080,117.73 $252,933.91 $357,989.07
增值经销商 $34,967,517.33 $175,002.81 $30,892,354.33 $592,385.71 $3,307,774.48
Warehouse $38,726,913.48 $331,169.64 $29,329,909.50 $932,521.23 $8,133,313.11

为了制作一个仅包含配饰和服装产品、增值经销商和仓库经销商数据的表格,同时保留整体总数,可以使用非可视化方式写成:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0,  
{[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 1  
from [Adventure Works])  
where [Measures].[Reseller Sales Amount]  

生成以下结果:

业务类型+类别 所有产品 配件 Clothing
所有经销商 $80,450,596.98 $571,297.93 $1,777,840.84
增值经销商 $34,967,517.33 $175,002.81 $592,385.71
Warehouse $38,726,913.48 $331,169.64 $932,521.23

若要生成一个表,该表以直观方式汇总列,而行总计则给出所有 [Category] 的准确总计,应执行以下查询:

select [Category].members on 0,  
[Business Type].members on 1  
from NON VISUAL (Select {[Category].Accessories, [Category].Clothing} on 0  
from ( Select {[Business Type].[Value Added Reseller], [Business Type].[Warehouse]} on 0  
from [Adventure Works])  
)  
where [Measures].[Reseller Sales Amount]  

请注意,“NON VISUAL” 仅适用于 [Category]。

上述查询生成以下结果:

业务类型+类别 所有产品 配件 Clothing
所有经销商 $73,694,430.80 $506,172.45 $1,524,906.93
增值经销商 $34,967,517.33 $175,002.81 $592,385.71
Warehouse $38,726,913.48 $331,169.64 $932,521.23

与以前的结果相比,可以观察到[所有经销商]行现在加到[增值经销商]和[仓库]的显示值中,而[所有产品]列显示所有产品的总值,包括未显示的值。

以下示例演示如何在子选择中使用计算成员来过滤它们。 为了能够复现该样本,必须使用连接字符串参数子查询=1建立连接。

select Measures.allmembers on 0  
from (  
Select { [Measures].[Reseller Sales Amount]  
, [Measures].[Reseller Total Product Cost]  
, [Measures].[Reseller Gross Profit]  
, [Measures].[Reseller Gross Profit Margin]  
} on 0  
from [Adventure Works]  
)  

上述查询生成以下结果:

经销商销售金额 经销商总产品成本 转售商毛利 转售商毛利润率
$80,450,596.98 79,980,114.38美元 470,482.60美元 0.58%