【问题标题】:wrong Total using case-when in MDX在 MDX 中使用 case-when 时的 Total 错误
【发布时间】:2016-05-28 08:00:34
【问题描述】:

如果我使用以下负总数而不是前一个,我将获得相同的输出,但仍然不是我的预期输出。有没有人可以帮帮我?

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 Activity] 就像广告、折扣, 赞助销售等 [Account Marketing] 是这些东西的组合,我的意思是广告是费用,而折扣存储为负收入,因此最终折扣将被视为营销费用这就是为什么我的会员 [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]

【问题讨论】:

  • 我认为这是一个棘手的问题,我试图整理一个月。请帮我修好。提前致谢

标签: mdx


【解决方案1】:

由于[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

【讨论】:

  • 你是冠军!!!你不会意识到我有多开心!我挣扎了太久才能解决,最后你解决了!沙巴什!!
  • (upped) 不错的答案 Sourav
  • 我已经在另一个用户@shamim 下发布了我的真实但非常接近这个解决方案。请看一下
【解决方案2】:

(只是为了添加到 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]
  )

【讨论】:

  • 感谢您提供替代 IIF 解决方案而不是 Case-When 然而,这个问题实际上是我主要问题的一部分。我还有另一个需要使用 case-when 条件检查的条件。很快我将在另一篇文章中发布我的整个问题,然后你会看到并尝试解决整个问题。你们真是乐于助人。感谢您的关心
  • 我刚刚检查了您的解决方案并且工作正常。再次感谢
  • 你能看看上面的答案吗,这确实是个问题,我还在苦苦挣扎
  • 你能看看上面的答案吗,这确实是个问题,我还在苦苦挣扎
  • 我已经在另一个用户@shamim 下发布了我的真实但非常接近这个解决方案。请看一下
【解决方案3】:

哇!我得到了答案,这就是我要找的东西。什么都没有,只是改变了【阴性总测试】的显示。我再次感谢 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]

【讨论】:

  • @SouravA 你能看看吗,我还在挣扎
  • @SouravA 我注意到如果我使用 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] )这条线连同我的总代码实际上是 [Dim Account].[Account Activity].[All] 的两倍,这就是为什么总数是 1269026 而不是 650920
猜你喜欢
  • 1970-01-01
  • 2022-01-18
  • 2016-08-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-22
  • 2019-03-31
  • 1970-01-01
相关资源
最近更新 更多