MDX:重复过滤

时间:2015-06-16 09:29:56

标签: mdx olap olap-cube

我想写一个MDX查询,只有当特定的重复尺寸重复一次时才显示值。

这是我的mdx查询:

SELECT 
NON EMPTY { [Measures].[Value] } ON COLUMNS,
NON EMPTY { ([Dim Result].[Sample Number].[Sample Number].ALLMEMBERS 
             * [Dim Parameter].[IdParameter].[IdParameter].ALLMEMBERS ) } ON ROWS                                 
FROM [Cube]

结果如下:

Sample Number          IdParameter        Value
1                      3                 5
1                      4                 6
2                      3                 2
3                      4                 0

我想要的是只获取重复的样本数值:

Sample Number          IdParameter       Value
1                      3                 5
1                      4                 6   

并删除其他未重复的值

Sample Number          IdParameter       Value
2                      3                 2
3                      4                 0

我不知道我怎么能做到这一点,它是可行的吗?

我写下一个mdx:

SELECT NON EMPTY {[Measures].[Recuento Fact Result]} ON COLUMNS,

 NON EMPTY { [Dim Result].[Sample Number].[Sample Number] }  ON ROWS
 FROM ( SELECT ({ [Dim Parameter].[IdParameter].&[420] , [Dim Parameter].[IdParameter].&[20] }    ) ON COLUMNS 

 FROM [cube])

结果是:

Sample Number    Recount Fact Result 
1                          1
2                          2
3                          2
4                          1

我想要的只是获得重新计数大于1的样本编号

感谢您的帮助

2 个答案:

答案 0 :(得分:0)

我的方法是创建一个计算成员,每个SampleNumber保留一些不同的非空成员。然后过滤掉上述计数不大于1的元组。

UNTESTED (不在我的系统附近)

WITH MEMBER [Measures].CntParametersPerSampleNumber as 
      DistinctCount(   
      NonEmpty(
               [Dim Parameter].[IdParameter].CHILDREN,
               ([Dim Result].[Sample Number].CURRENTMEMBER, [Measures].[Value])
              )
                   )

SELECT 
NON EMPTY { [Measures].[Value] } ON COLUMNS,
NON EMPTY { 
      Filter(
             (
             [Dim Result].[Sample Number].[Sample Number].ALLMEMBERS 
             * 
             [Dim Parameter].[IdParameter].[IdParameter].ALLMEMBERS 
             ), [Measures].CntParametersPerSampleNumber>1
            ) 
          } ON ROWS                                 
FROM [Cube]

答案 1 :(得分:0)

您似乎有两个不同的问题。

第二个问题可以使用HAVING子句来回答:

SELECT 
    NON EMPTY 
      {[Measures].[Recuento Fact Result]} ON 0,
    NON EMPTY 
      {[Dim Result].[Sample Number].[Sample Number]}  
    HAVING [Measures].[Recuento Fact Result] > 1
    ON 1
FROM 
  ( 
    SELECT 
      ({ 
        [Dim Parameter].[IdParameter].&[420] 
      , [Dim Parameter].[IdParameter].&[20] 
      }) ON 0
   FROM [cube]
  )

对于您的第一个问题,您应该能够迭代地使用Filter函数来检测样本编号是否重复:

WITH
SET     [OrderedSampleNums] AS
        Order(
          [Dim Result].[Sample Number].[Sample Number].ALLMEMBERS ,
          [Dim Result].[Sample Number].CurrentMember.Caption,
          BASC
        )
SET     [RepeatedSampleNums] AS
        Filter(
          OrderedSampleNums ,
          OrderedSampleNums.Item(
            OrderedSampleNums.CurrentOrdinal-1
          ).Caption = [Dim Result].[Sample Number].CurrentMember.Caption
        )
SET     [NonRepeatedSampleNums] AS
        Except(
           OrderedSampleNums
          ,RepeatedSampleNums
        )
SELECT 
  NON EMPTY 
   {[Measures].[Value]} ON 0,
  NON EMPTY 
    [NonRepeatedSampleNums]
    * 
    [Dim Parameter].[IdParameter].[IdParameter].ALLMEMBERS
  ON 1                                 
FROM [Cube];

未经测试但我可以尝试针对AdvWorks多维数据集进行原型设计以进一步探索?