书中关于Item的讲解有点不好理解,通过查询一些文档,这里对它进行进一步说明。
这个函数是用于返回集合中的某一元组,当已经定位到元组的时候,可以返回元组中的某一成员。
{Set} | (Tuple.Item(i) 这里的i从0开始
{Set}.Item(String1 [,String2,..., Stringn])
举个例子:
SELECT {} on columns ,
{ [Product].[Category].[Category] * [Measures].[Internet Sales Amount] } on rows
FROM [Step-by-Step]
这段代码的返回结果是
Accessories Internet Sales Amount
Bikes Internet Sales Amount
Clothing Internet Sales Amount
Components Internet Sales Amount
这里返回了Category里面的所有成员,注意我们返回的是一个集合,包含四个元组,每个元组里面两个成员。
如果我们想要只返回第二行记录即第二个元组, 怎么办呢?这时候我们就需要用到Item,修改上面的语句:
select {} on columns ,
{ [Product].[Category].[Category] * [Measures].[Internet Sales Amount] }.Item(1) on rows
FROM [Step-by-Step]
这段代码返回的结果是
Bikes Internet Sales Amount
如果我们想要返回上面的元组中的第一个成员,怎么办呢?继续修改上面的语句:
select {} on columns ,
{ [Product].[Category].[Category] * [Measures].[Internet Sales Amount] }.Item(1).Item(0) on rows
FROM [Step-by-Step]
好,现在我们了解了Item的基本用法,现在我们来看书中的代码:
WITH
MEMBER [Measures].[Top Product Sales] AS
{
EXISTING
TopCount(
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
) *
{[Measures].[Internet Sales Amount]}
}.Item(0)
,FORMAT_STRING="Currency"
MEMBER [Measures].[Top Product Name] AS
{
EXISTING
TopCount(
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
)
}.Item(0).Item(0).name
SELECT
{
([Measures].[Internet Sales Amount]),
([Measures].[Top Product Sales]),
([Measures].[Top Product Name])
} ON COLUMNS,
{
([Date].[Calendar Year].[CY 2001]),
([Date].[Calendar Year].[CY 2002]),
([Date].[Calendar Year].[CY 2003]),
([Date].[Calendar Year].[CY 2004])
} ON ROWS
FROM [Step-by-Step]
;
这段代码较长,为了便于理解,我们先看下面这段代码的返回结果:
SELECT {} on columns,
{ TopCount(
[Product].[Product].[Product].Members,
1,
([Measures].[Internet Sales Amount])
)
}*
{
[Measures].[Internet Sales Amount]
} on rows
FROM [Step-by-Step]
;
Road-150 Red, 48 Internet Sales Amount
这里我们注意到返回的是一个元组(某一Product, Internet Sales Amount)
现在我们再来理解书中的语句:
[Measures].[Top Product Sales] 返回的是在某一年中Internet Sales Amount最高的产品所对应的值, [Measures].[Top Product Nam] 返回了该产品。
这里我们需要注意Item返回的结果值的作用域,可以参考https://thomasivarssonmalmo.wordpress.com/2009/05/20/the-item-function-with-mdx-code-examples/
Generate 函数
这个函数,书中给的用法可能不太好理解。我们先看两段MDX 代码,然后与Generate 结合起来使用再查看结果,帮助理解。
SELECT {[Measures].[Internet Sales Amount]} ON COLUMNS
FROM [Step-by-Step]
这段代码的返回结果是
Internet Sales Amount
$29,358,677.22
SELECT {} ON COLUMNS , [Date].[Calendar Year].[Calendar Year].MEMBERS ON ROWS
FROM [Step-by-Step]
这段代码的返回结果是:
CY 2001
CY 2002
CY 2003
CY 2004
CY 2006
从上面的语句我们可看到,Calendar Year 一共有5个值。现在我们来理解下面这段代码的含义:
SELECT
GENERATE( [Date].[Calendar Year].[Calendar Year].MEMBERS
, {[Measures].[Internet Sales Amount]},ALL)
ON COLUMNS
FROM [Step-by-Step]
;
查询出Internet Sales Amount 的结果,然后把结果放入到Calendar Year的每个成员当中,不去除掉重复数据。所以上面的代码运行结果:
Internet Sales Amount Internet Sales Amount Internet Sales Amount Internet Sales Amount Internet Sales Amount
$29,358,677.22 $29,358,677.22 $29,358,677.22 $29,358,677.22 $29,358,677.22
通过上面这个例子我们可以知道enerate 实现的循环的功能, 循环的次数由第一个参数决定的。