Microsoft SQL Server MDX step by step 第六章

2 篇文章 0 订阅

书中关于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 实现的循环的功能, 循环的次数由第一个参数决定的。

 

 

 

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值