【问题标题】:Implementing IN /LIKE in MDX在 MDX 中实现 IN /LIKE
【发布时间】:2019-05-30 16:25:39
【问题描述】:

我有一个名为[Band] 的维度,它可以有几个不同的值:

[Band].&[A]&[Under $400]
[Band].&[B]&[$400 - $1,000]
[Band].&[C]&[$1,000 - $2,500]
[Band].&[D]&[$2,500 - $3,500]
...

我正在尝试编写一个查询,我可以在其中剪切这些值的子列表。

这里的查询不起作用,因为 .isin 函数在 MDX 中不存在,但你会看到我正在尝试做什么:

SELECT 
  NON EMPTY {[Measure A], [Measure B]} ON COLUMNS, 
  NON EMPTY {([Band].isin(['Under $400', '$400 - $1,000']).ALLMEMBERS)} --fail on .isin(
  DIMENSION PROPERTIES MEMBER_CAPTION ON ROWS
FROM (
  SELECT 
    ({[Foo].&[Bar]}) ON COLUMNS 
  FROM
    [CUBE]
)

现在,这是一个有效的查询,但它只给了我一个 [Band] 值:

SELECT 
  NON EMPTY {[Measure A], [Measure B]} ON COLUMNS, 
  NON EMPTY {([Band].&[A]&[Under $400])}
  DIMENSION PROPERTIES MEMBER_CAPTION ON ROWS
FROM (
  SELECT 
    ({[Foo].&[Bar]}) ON COLUMNS 
  FROM
    [CUBE]
)

这会返回一个有效的结果:

              Measure A    Measure B
Under $400    1795.67%     58.48%

但我希望看到它返回多个 [Band] 维度值的聚合值的结果。这在 MDX 中如何实现?

您可能会说我以前从未使用过 MDX,但是当我搜索这个问题时,我看到了 taking the intersect 或使用 ChildrenSet 之类的东西。但这似乎不是很直观。

你能指出我正确的方向吗?

【问题讨论】:

    标签: ssas mdx


    【解决方案1】:

    以下是如何在 MDX 中实现 IsIn 功能的列表

    1)您想过滤使用 in 子句并显示成员。 在此示例中,我想查看来自 Adventurewroks 示例 db 的自行车和服装类别的互联网销售

    select 
    [Measures].[Internet Sales Amount]
    on columns,
    {[Product].[Category].&[1]
    ,[Product].[Category].&[3]}
    on rows 
    from 
    [Adventure Works]
    

    结果

    2)我想按 IN 子句过滤,但不想显示成员 在此示例中,我想查看 Adventurewroks 示例数据库中自行车和服装类别的年度互联网销售情况。结果是被岁月打破。

    select 
    [Measures].[Internet Sales Amount]
    on columns,
    non empty 
    [Date].[Calendar Year].[Calendar Year]
    on rows 
    from 
    [Adventure Works]
    where 
    {[Product].[Category].&[1]
    ,[Product].[Category].&[2]}
    

    结果

    您可以通过使用子查询来实现相同的目标

    select 
    [Measures].[Internet Sales Amount]
    on columns,
    non empty 
    [Date].[Calendar Year].[Calendar Year]
    on rows 
    from 
    (select {[Product].[Category].&[1],[Product].[Category].&[2]} on 0 from [Adventure Works])
    

    结果

    3)当你想实现基于名称的IN子句时 在此示例中,我想查看来自 Adventurewroks 示例数据库的自行车和服装类别的互联网销售情况,但在本例中,我使用的是标题

    select 
    [Measures].[Internet Sales Amount]
    on columns,
    filter(
    [Product].[Category].[Category],
    [Product].[Category].currentmember.name='Bikes' or [Product].[Category].currentmember.name='Clothing'
    )
    on rows 
    from 
    [Adventure Works]
    

    结果:

    4) 当您基于名称实现 IN 子句并且您的条件正在寻找特定文本时(Like 子句) 在此示例中,我想查看来自 Adventurewroks 示例 db 的自行车和服装类别的互联网销售情况,但在本例中,我正在搜索标题名称以查找一段字符串。

    select 
    [Measures].[Internet Sales Amount]
    on columns,
    FILTER([Product].[Category].[Category],
    Instr([Product].[Category].currentmember.name, 'Bik') > 0
    or 
    Instr([Product].[Category].currentmember.name, 'oth') > 0
    )
    on rows 
    from 
    [Adventure Works]
    

    结果

    【讨论】:

      【解决方案2】:

      我想明白了

      SELECT 
        NON EMPTY {[Measure A], [Measure B]} ON COLUMNS, 
        NON EMPTY {[Band].[Under $400], [Band].[$1,000 - $2,500]}
        DIMENSION PROPERTIES MEMBER_CAPTION ON ROWS
      FROM (
        SELECT 
          ({[Foo].&[Bar]}) ON COLUMNS 
        FROM
          [CUBE]
      )
      

      【讨论】:

      • 如果你想用这种方式做多个维度,它变成{([dim A]).ALLMEMBERS} * {[Band].[Under $400], [Band].[$1,000 - $2,500]}
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2012-06-22
      • 1970-01-01
      • 2015-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-20
      相关资源
      最近更新 更多