MDX Step by Step 读书笔记(六) - Building Complex Sets (复杂集合的处理) - Combining Sets

浏览: 2730

Combining Sets

不同的集合可以通过一定的方式组成新的集合,常提到的几种联合集合的方式如下图所示:

                       

  • Union 模式 – 两个集合连接在一起形成一个新的集合,这个新集合包含了左右两边集合的内容。
  • Intersection 模式 – 只有内容相同的一部分才能被保留下来形成一个新的集合。
  • Exception 模式 – 第一个集合不在第二个集合的范围,保留下来形成一个新的集合。

语法 –

Union ({Set1}, {Set2} [, ALL])

Intersect ({Set1}, {Set2} [, ALL])

Exception ({Set1}, {Set2} [, ALL])

这三个函数都要求作为参数的两个集合必须属于同一个纬度,被函数返回的集合中的元组都是唯一的,相当于在返回的集合上使用了 DISTINCT 一样,除非使用 ALL 来标示不需要DISTINCT。

通常情况下,Union 和 Exception 使用的频率会多一些,所以MDX 语言为它们提供了一种更简单的表达方式。可以使用 + 和 – 来替代,但是这时就不能使用 ALL 标志了。

示例一 – 查询2004年零售额最高的10个产品

SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
TopCount(
{[Product].[Product].[Product].Members},
10,
([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004])
) ON ROWS
FROM [Step-by-Step];

示例二 – 使用UNION 查询2003年和2004年各自零售额最高的10个产品

SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Union(
  TopCount(
    {[Product].[Product].[Product].Members},
    10,
    ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003])
  ),
  TopCount(
    {[Product].[Product].[Product].Members},
    10,
    ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004])
  )
) ON ROWS
FROM [Step-by-Step];

总共只有12个产品查询出来,很显然有一些产品既在第一个集合中也在第二个集合中存在。

示例三 – 看看2013年的前10产品跌出了2014年前10

SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Except(
    TopCount(
      {[Product].[Product].[Product].Members},
      10,
      ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003])
    ),
    TopCount(
      {[Product].[Product].[Product].Members},
      10,
      ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004])
    )
) ON ROWS
FROM [Step-by-Step];

示例四 – 2004年前10的产品不在2003年前10的有哪些

SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Except(
  TopCount(
      {[Product].[Product].[Product].Members},
      10,
      ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004])
    ),
  TopCount(
      {[Product].[Product].[Product].Members},
      10,
      ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003])
  )
) ON ROWS
FROM [Step-by-Step];

示例五 – 查看有哪些产品在2003年和2004年都是前10的

SELECT
{([Measures].[Reseller Sales Amount])} ON COLUMNS,
Intersect(
    TopCount(
      {[Product].[Product].[Product].Members},
      10,
      ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2004])
    ),
    TopCount(
      {[Product].[Product].[Product].Members},
      10,
    ([Measures].[Reseller Sales Amount], [Date].[Calendar Year].[CY 2003])
    )
) ON ROWS
FROM [Step-by-Step]

推荐 0
本文由 BIWORK 创作,采用 知识共享署名-相同方式共享 3.0 中国大陆许可协议 进行许可。
转载、引用前需联系作者,并署名作者且注明文章出处。
本站文章版权归原作者及原出处所有 。内容为作者个人观点, 并不代表本站赞同其观点和对其真实性负责。本站是一个个人学习交流的平台,并不用于任何商业目的,如果有任何问题,请及时联系我们,我们将根据著作权人的要求,立即更正或者删除有关内容。本站拥有对此声明的最终解释权。

0 个评论

要回复文章请先登录注册