在 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 的好解决方案中)
CASE
和 IIF
都很慢 - 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]
如果我使用以下负总计而不是前一个负总计,我会得到相同的输出,但仍然不是我预期的输出。有人可以帮助我吗?
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 的好解决方案中)
CASE
和 IIF
都很慢 - 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]