MDX计算不同值的总和

时间:2016-02-22 22:19:24

标签: distinct mdx pentaho

我想知道是否有可能创建一个计算成员来获取事实的不同值的总和。我将尝试用以下示例来解释它:

我有一个事实,其中主键与两个维度(一对多基数)相关。事实包含一个度量,它的值对于FACT_ID和DIM_1_ID的每个不同组合的所有成员是相同的。对于总数,我不想多次考虑相同的值。因此,使用以下值总数应为450而不是850 (默认的蒙德里安行为)。

    | FACT_ID | DIM_1_ID | DIM_2_ID | MEASURE |
    |---------|----------|----------|---------|
    | 1       | A        | D        | 100     |
    | 1       | A        | E        | 100     |
    | 1       | B        | F        | 50      |
    | 2       | A        | D        | 300     |
    | 2       | A        | E        | 300     |
    |---------|----------|----------|---------|
                              TOTAL | 450     |

有可能吗?怎么能用蒙德里安呢?

提前致谢

更新 - 当前状态

如下面的其中一条评论中所述,基于@ whytheq的答案,我设法计算总数的正确值,使用以下MDX公式进行度量:

Sum( 
    Order(
        [dActivity.hActivity].[lActivity].MEMBERS*[dFacility.hFacility].[lFacilit‌​y].MEMBERS, 
        [dActivity.hActivity].[lActivity].currentmember.name
    ) as [m_set] , 
    iif( 
        [m_set].currentordinal = 0 
        OR 
        not(
            [m_set]
            .item([m_set].currentordinal)
            .item(0).NAME 
            = 
            [m_set]
            .item([m_set].currentordinal-1)
            .item(0).NAME
        ) , 
        [Measures].[mBudget] 
        , 
        0 
    ) 
)

但是,此表达式使用每一行的完整集,因此结果会覆盖不同事实行的度量实数值。

    | FACT_ID | DIM_1_ID | DIM_2_ID | MEASURE |
    |---------|----------|----------|---------|
    | 1       | A        | D        | 450     |
    | 1       | A        | E        | 450     |
    | 1       | B        | F        | 450     |
    | 2       | A        | D        | 450     |
    | 2       | A        | E        | 450     |
    |---------|----------|----------|---------|
                              TOTAL | 450     |

2 个答案:

答案 0 :(得分:1)

很棒的问题 - 在MDX中真的很棘手。

如果我们执行以下操作,则会返回158行 - 少数具有[Measures].[Internet Sales Amount]的重复值:

SELECT 
  [Measures].[Internet Sales Amount] ON 0
 ,NON EMPTY 
    Order
    (
      [Product].[Product].[Product]
     ,[Measures].[Internet Sales Amount]
     ,bdesc
    ) ON 1
FROM [Adventure Works];

如果上述成员对于相应的度量不同,则仅计算它们:

WITH 
  SET [x] AS 
    Order
    (
      NonEmpty
      (
        [Product].[Product].[Product]
       ,[Measures].[Internet Sales Amount]
      )
     ,[Measures].[Internet Sales Amount]
     ,bdesc
    ) 
  SET [FILTERED] AS 
    Filter
    (
      [x]
     ,
        (
          [x].Item(
          [x].CurrentOrdinal - 1)
         ,[Measures].[Internet Sales Amount]
        )
      <> 
        (
          [x].Item(
          [x].CurrentOrdinal)
         ,[Measures].[Internet Sales Amount]
        )
    ) 
  MEMBER [Measures].[distCount] AS 
    Count([FILTERED]) 
SELECT 
  [Measures].[distCount] ON 0
FROM [Adventure Works];

也许尝试将EXISTING关键字添加到您的计算中:

Sum
(
  Order
  (
     EXISTING   //<<<
      [dActivity.hActivity].[lActivity].MEMBERS
    * 
      [dFacility.hFacility].[lFacilit‌​y].MEMBERS
   ,[dActivity.hActivity].[lActivity].CurrentMember.Name
  ) AS [m_set]
 ,IIF
  (
      [m_set].CurrentOrdinal = 0
    OR 
      (NOT 
          [m_set].Item(
          [m_set].CurrentOrdinal).Item(0).Name
        = 
          [m_set].Item(
          [m_set].CurrentOrdinal - 1).Item(0).Name)
   ,[Measures].[mBudget]
   ,0
  )
)

答案 1 :(得分:0)

您可以尝试获取该组的平均值。代码有点复杂。

WITH SET SomeSet AS 
{
        Fact.FactID.FactID.MEMBERS
        *
        Fact.DimID1.DimID1.MEMBERS
        *
        Fact.DimID2.DimID2.MEMBERS
}
MEMBER Measures.AvgVal AS
AVG
    (
     {Fact.FactID.CURRENTMEMBER}
     *
     {Fact.DimID1.CURRENTMEMBER}
     *
     NonEmpty
        (
         Fact.DimID2.DimID2.MEMBERS,
         {{Fact.FactID.CURRENTMEMBER} * 
         {Fact.DimID1.CURRENTMEMBER}} * 
         [Measures].[TheMeasure]
        )
     ,
     [Measures].[TheMeasure]
    )


SELECT NON EMPTY SomeSet ON 1,
NON EMPTY {
           [Measures].[TheMeasure], 
           Measures.AvgVal
          } on 0
from [YourCube]

我正在做的是,对于轴上的当前FactID - DimID1组合,我获取所有可能DimID2的列表,然后通过内部生成的非-FactID-DimID1-DimID2的空元组,得出度量的平均值TheMeasure

因此,例如,对于FactID = 1DimID1 = A

的组合,将显示(100 + 100)/ 2 = 100值