MDX:定义维度子集并显示总计

时间:2017-07-07 08:18:45

标签: filtering ssas mdx ssas-tabular

因为在MDX中您可以指定成员 [all] 以在维度的所有成员之间添加聚合,如果我想显示某个度量的总计,我可以构建一个类似的查询

SELECT {
    [MyGroup].[MyDimension].[MyDimension].members, 
    [MyGroup].[MyDimension].[all] 
    } *
    [Measures].[Quantity] on 0
FROM [MyDatabase]

现在我想过滤MyDimension获取一堆值并显示所选值的总和,但当然如果我生成查询

SELECT {
    [MyGroup].[MyDimension].[MyDimension].&[MyValue1], 
    [MyGroup].[MyDimension].[MyDimension].&[MyValue2], 
    [MyGroup].[MyDimension].[all] 
    } *
    [Measures].[Quantity] on 0
FROM [MyDatabase]

显示MyValue1,MyValue2的数量以及所有MyDimension成员的总数,而不仅仅是我选择的

我调查了一下,得出了一个解决方案,包括生成一个子查询来过滤我的值

SELECT {
    [MyGroup].[MyDimension].[MyDimension].members, [MyGroup].[MyDimension].[all]
    } * [Measures].[Quantity] ON 0
FROM (
    SELECT {
        [MyGroup].[MyDimension].[MyDimension].&[MyValue1], 
        [MyGroup].[MyDimension].[MyDimension].&[MyValue2]
        } ON 0
    FROM [MyDatabase]
)

假设这有效,是否有更简单或更直接的方法来实现这个

我尝试使用 SET 语句来定义我的自定义元组集,但后来我无法显示总数。

请记住,在我的示例中,我保持尽可能简单,但在实际情况下,我可以在行和列上具有多个维度,以及使用 MEMBER 语句定义的多个计算度量。

谢谢!

1 个答案:

答案 0 :(得分:2)

你所做的是标准的 - 这个简单的方法!

使用子选择时要记住的一件事是它不是完整的过滤器,因为原始的All仍然可用。我认为这与mdx中的子句的查询处理有关 - 这是我的意思的一个例子:

WITH 
  MEMBER [Product].[Product Categories].[All].[All of the Products] AS 
    [Product].[Product Categories].[All] 
SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,NON EMPTY 
    {
      [Product].[Product Categories].[All]                        //X
     ,[Product].[Product Categories].[All].[All of the Products]  //Y
     ,[Product].[Product Categories].[Category].MEMBERS
    } ON 1
FROM 
(
  SELECT 
    {
      [Product].[Product Categories].[Category].&[4]
     ,[Product].[Product Categories].[Category].&[1]
    } ON 0
  FROM [Adventure Works]
);

因此标记为X的行将是类别4和1的总和,但是行Y将指向整个Adventure Works:

enter image description here

虽然在WITH子句中使用All成员时有点混乱,但这种行为很有用。