在 MDX 中使用 case-when 的总数错误

wrong Total using case-when in MDX

如果我使用以下负总计而不是前一个负总计,我会得到相同的输出,但仍然不是我预期的输出。有人可以帮助我吗?

MEMBER [Measures].[Negative Total] AS
CASE
    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) < 0
    THEN [Measures].[Total]*-1
    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) > 0
    THEN 0
END

让我解释一下我想要实现的目标。我有一个 [Dim Account] 的维度,它具有 [Account Type]、[Account Activity]、[Account Marketing] 等属性。[Account Type] 是收入、费用、.. [Account [=17] =]] 就像广告、折扣、赞助销售等 [帐户营销] 是这些东西的组合 我的意思是广告是费用,而折扣存储为负收入,所以最终折扣将被视为营销费用 这就是为什么我的成员 [Negative Total] 正在将收入乘以 -1,我想排除那些收入为正的收入,因为它们是收入。我只想显示那些转换后的收入,最后把它们加起来。在我的 MDX 中,数据显示完美,但原始值 -43380.4 +18 - 9181.32= -52542.81 应该是 43380.4 +0 +9181.32= 52561.72。为了将原始总数与预期总数进行比较,我同时显示了 [Measure].[Total] 和 [Measure].[Negative Total]。如果你知道诀窍,请帮助我

WITH
MEMBER [Measures].[Negative Total] AS
CASE
    WHEN
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]<1
    THEN [Measures].[Total]*-1

    WHEN 
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]>1 
    THEN 0
END

SELECT
 {
 [Measures].[Total],[Measures].[Negative Total]} on COLUMNS
 , 
NON EMPTY 
 (
    {
        (
        [Dim Account].[HierarchyMarketing].[Account Marketing].&[Income]&[Marketing] 
        *
        {
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        VISUALTOTALS([Dim Account].[Account Activity].[All])
        }
        )
     }
    ,
    [Dim Branch].[Trading As].&[BAR]&[Barlens Event Hire] ,
    [Dim Scenario].[Scenario Name].&[Actual]  ,
    [Dim Fiscal Year].[HierarchyFiscal].[E Month].&[2016]&[December]
 )
 on ROWS
FROM [CubeProfitLoss]

它按预期工作,因为 [All] 也是成员。

要实现您想要的结果,请添加一个获得负总数的基本度量,然后在最终计算中使用它。

MEMBER [Measures].[Negative Total Test] AS
CASE
    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) < 0
    THEN [Measures].[Total]*-1
    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) > 0
    THEN 0
END

MEMBER [Measures].[Negative Total] AS
CASE
    WHEN [Dim Account].[Account Activity].CURRENTMEMBER IS  [Dim Account].[Account Activity].[All]
    SUM(
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        [Measures].[Negative Total Test]
       )
   ELSE [Measures].[Negative Total Test]
END

(只是为了添加到 Sourav 的好解决方案中)

CASEIIF 都很慢 - IIF 在某些情况下可以更快,通常如果它的分支之一可以是 NULL 则它是更快的选择:

MEMBER [Measures].[Negative Total Test] AS
  IIF(
    (
       [Measures].[Total]
      ,[Dim Account].[Account Marketing].&[Income]&[Marketing]
    ) >= 0
      ,NULL
      ,[Measures].[Total] * -1
  )
MEMBER [Measures].[Negative Total] AS
  IIF( 
    [Dim Account].[Account Activity].CURRENTMEMBER 
       IS [Dim Account].[Account Activity].[All]
    ,SUM(
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        [Measures].[Negative Total Test]
       )
   ,[Measures].[Negative Total Test]
  )

根据屏幕截图,无需在第一个计算中包含营销,因此进一步简化可以是:

MEMBER [Measures].[Negative Total Test] AS
  IIF(
    [Measures].[Total] >= 0
   ,NULL
   ,[Measures].[Total] * -1
  )
MEMBER [Measures].[Negative Total] AS
  IIF( 
    [Dim Account].[Account Activity].CURRENTMEMBER 
       IS [Dim Account].[Account Activity].[All]
    ,SUM(
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        [Measures].[Negative Total Test]
       )
   ,[Measures].[Negative Total Test]
  )

哇!我得到了答案,这就是我一直在寻找的东西。没什么,唯一变化的是【总检阴性】的显示。我再次感谢 Saurav,因为他给了我 MDX 代码的生命。

WITH
MEMBER [Measures].[Negative Total Test] AS
CASE
    WHEN
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]<1
    THEN [Measures].[Total]*-1

    WHEN 
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]>1 
    THEN NULL
 ELSE 
  [Measures].[Total]
END

MEMBER [Measures].[Negative Total] AS
CASE
 WHEN  [Dim Account].[Account Activity].CURRENTMEMBER IS  [Dim Account].[Account Activity].[All]
 THEN 
 SUM(
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        [Measures].[Negative Total Test]
       )
   ELSE [Measures].[Negative Total Test]
END

MEMBER [Dim Account].[HierarchyMarketing].[Income] AS
 ([Dim Account].[HierarchyMarketing].[Account Type].&[Income], [Measures].[Negative Total])

MEMBER [Dim Account].[HierarchyMarketing].[Total Marketing Expense] AS
 AGGREGATE
 (
 {
 [Dim Account].[Account Marketing].&[Income]&[Marketing]
 ,
 [Dim Account].[Account Marketing].&[Expenses]&[Marketing] 
 }
 ,
 [Measures].[Negative Total]
 )

SELECT
 {
 //[Measures].[Total], [Measures].[Negative Total], 
 [Measures].[Negative Total Test]
 } on COLUMNS
 , 
 NON EMPTY 
 (
    {
  (
  [Dim Account].[HierarchyMarketing].[Account Type].&[Income]
  * 
  {
  [Dim Account].[Account Activity].[All]
  } 
  )
  ,
        (
        {
          [Dim Account].[HierarchyMarketing].[Account Marketing].&[Expenses]&[Marketing]
            ,
   [Dim Account].[HierarchyMarketing].[Account Marketing].&[Income]&[Marketing] 
        }
        *
        [Dim Account].[Account Activity].[Account Activity].MEMBERS 
        )
        ,
        (
        [Dim Account].[HierarchyMarketing].[Total Marketing Expense] 
     ,
  [Dim Account].[Account Activity].[All]  
        )
     } 
 ,
// Traders,
 [Dim Branch].[Trading As].&[BAR]&[Barlens Event Hire] ,
 [Dim Scenario].[Scenario Name].&[Actual]  ,
 [Dim Fiscal Year].[HierarchyFiscal].[E Month].&[2016]&[December]
 )
 on ROWS
FROM [CubeProfitLoss]
;

我应该问另一个问题,但是我已经达到了我的问题限制,很抱歉。 上面的问题是我问题的一部分。最终输出应该像我编辑的图片一样。根据 Sourav 的解决方案,他检查了 [Dim Account].[Account Activity].CURRENTMEMBER IS [Dim Account].[Account Activity].[All] 的情况,但这个小问题完美解决了当我想用原始收入(650,920.88)积累时,它会得出一个意想不到的大数字。我需要的另一个解决方案我想将营销费用 (24010.44) 与已经转换的负营销收入 (43380.4+9181.32) 相加,因此最终结果应该是 76572.16。请修改我的MDX。非常感谢

WITH

//MEMBER [Measures].[Negative Total Test] AS -- (1)
//CASE
//    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) < 0
//    THEN [Measures].[Total]*-1
//    WHEN ([Measures].[Total],[Dim Account].[Account Marketing].&[Income]&[Marketing]) > 0
//    THEN NULL
// ELSE
// [Measures].[Total]
//END

MEMBER [Measures].[Negative Total Test] AS --(2)
CASE
    WHEN
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]<1
    THEN [Measures].[Total]*-1

    WHEN 
        [Dim Account].[Account Marketing].CurrentMember.MEMBER_CAPTION="Marketing" AND
        [Dim Account].[Account Marketing].Properties("Account Type") ="Income" AND
        [Measures].[Total]>1 
    THEN NULL
 ELSE 
  [Measures].[Total]
END

MEMBER [Measures].[Negative Total] AS
CASE
    WHEN [Dim Account].[Account Activity].CURRENTMEMBER IS  [Dim Account].[Account Activity].[All]
    THEN
 SUM(
        [Dim Account].[Account Activity].[Account Activity].MEMBERS,
        [Measures].[Negative Total Test]
       )

   ELSE [Measures].[Negative Total Test]
END
//MEMBER [Dim Account].[Account Activity].[TOTAL] AS
// [Dim Account].[Account Activity].[All]

MEMBER [Dim Account].[HierarchyMarketing].[Total Marketing Expense] AS
 AGGREGATE
 (
 {
 [Dim Account].[Account Marketing].&[Income]&[Marketing]
 ,
 [Dim Account].[Account Marketing].&[Expenses]&[Marketing] 
 }
 ,
 [Measures].[Negative Total Test]
 )


SELECT
 {
 [Measures].[Total], [Measures].[Negative Total]
 } on COLUMNS
 , 
 NON EMPTY 
 (
    {
  (
  [Dim Account].[HierarchyMarketing].[Account Type].&[Income]
  * 
  {
  VisualTotals([Dim Account].[Account Activity].[All])
  } 
  )
  ,

        (
        {
            [Dim Account].[HierarchyMarketing].[Account Marketing].&[Expenses]&[Marketing]
            ,
   [Dim Account].[HierarchyMarketing].[Account Marketing].&[Income]&[Marketing] 
        }
        *
        [Dim Account].[Account Activity].[Account Activity].MEMBERS 
        )
        ,
        (
        [Dim Account].[HierarchyMarketing].[Total Marketing Expense] 
     ,
  VISUALTOTALS([Dim Account].[Account Activity].[All])  
        )
     } 
 ,
 [Dim Branch].[Trading As].&[BAR]&[Barlens Event Hire] ,
 [Dim Scenario].[Scenario Name].&[Actual]  ,
 [Dim Fiscal Year].[HierarchyFiscal].[E Month].&[2016]&[December]
 )
 on ROWS
FROM [CubeProfitLoss]