查询仅显示二维匹配元素

时间:2015-03-23 14:00:14

标签: mdx

简短问题: 知道我如何从一个维度条目中提取名称并将其作为过滤器应用到另一个维度:

详细说明:我的多维数据集具有制造商和销售商的尺寸,我只需要“自己”的销售。维度从源中的不同表加载,但具有完全相同名称的条目。

Manufacturer   Seller
  A              A       *
  A              D
  B              B       *
  C              C       *
  C              A
  C              D
A,B和C自己出售他们的产品,A和C也通过经销商D销售.C也通过A.销售。我想过滤标记的行(名称匹配)。

在SQL中这很简单,或者可以很容易地增强多维数据集以标记“自己的销售”,但这两个选项都不可用。我需要“按原样”查询多维数据集。

我尝试使用STRTOMEMBER和CURRENTMEMBER(使用NAME和MEMBER_NAME):

STRTOMEMBER("[Dim Seller].[Seller].[" + [Dim Producer].[Producer].CURRENTMEMBER.NAME + "]

这实际上在语法上有效,但是CURRENTMEMBER似乎总是评估为ALL并且为ALL元素提供(正确的)度量值,而不是匹配名称的值。

我还试图创建一个WHERE设置,两个名称相等

[Dim Seller].[Seller].CURRENTMEMBER.NAME = [Dim Producer].[Producer].CURRENTMEMBER.NAME

但这是非常SQL,在MDX中无效。

整个查询如下所示:

SELECT
    NON EMPTY {
        [Measures].[Value]
    } ON COLUMNS
    , NON EMPTY { (
        {
            [Dim Producer].[Producer].[A]
            , [Dim Producer].[Producer].[B]
            , [Dim Producer].[Producer].[C]
        }
        * [Dim Seller].[Seller].[Seller].ALLMEMBERS
// This line needs to be trimmed to same name as producer
    ) } ON ROWS
FROM
    [Cube]

生产者列表来自配置文件,并且字符串连接到查询并且可能会发生变化。让第二个卖家名单保持同步将是一种负担,但(当C通过A销售时)也会产生错误的结果。

知道如何从一个维度条目中提取名称并将其应用于另一个维度吗?

2 个答案:

答案 0 :(得分:3)

HAVING子句可能对您有所帮助:

SELECT
    NON EMPTY {
        [Measures].[Value]
    } ON COLUMNS
    , NON EMPTY { 
        {
              [Dim Producer].[Producer].[A]
            , [Dim Producer].[Producer].[B]
            , [Dim Producer].[Producer].[C]
        }
        * [Dim Seller].[Seller].[Seller].ALLMEMBERS
    } 
HAVING 
    [Dim Seller].[Seller].CURRENTMEMBER.MEMBER_NAME = 
            [Dim Producer].[Producer].CURRENTMEMBER.MEMBER_NAME
ON ROWS
FROM
    [Cube]

答案 1 :(得分:2)

使用GENERATE功能为您完成工作。

with set Producers as
{[Dim Producer].[Producer].[A]
,[Dim Producer].[Producer].[B]
,[Dim Producer].[Producer].[C]}

set Sellers as
[Dim Seller].[Seller].members

//For every producer, get the seller who shares the same name.
set ProducersHavingSameNameAsSellers as
GENERATE(Producers, GENERATE(Sellers, filter
                                                (Sellers, 
                                                    [Dim Seller].[Seller].CURRENTMEMBER.MEMBER_NAME = 
                                                    [Dim Producer].[Producer].CURRENTMEMBER.MEMBER_NAME
                                                )
                            )
        )

SELECT
NON EMPTY [Measures].[Value] ON COLUMNS,
ProducersHavingSameNameAsSellers ON ROWS
FROM [Cube]