Mdx 如何递归计算层次结构中包含空值的特定级别成员

Mdx 如何递归计算层次结构中包含空值的特定级别成员,mdx,olap,cube,Mdx,Olap,Cube,我在跳入MDX时遇到了一个误解。它与常规SQL非常不同。我已经处理了我的自定义多维数据集,并开发了一种特殊的计算方法 它有什么作用? 那么,它表示在某个级别(周、月、年)内的所有周是否都没有空值,并统计满足条件的店铺数量 我现在的黑客: WITH MEMBER [Measures].[Shop WBC] AS SUM ([Shop].[Shop ID].[Shop ID].Members, (IIF((Filter(Descendants([Time].[Week calendar], [Ti

我在跳入MDX时遇到了一个误解。它与常规SQL非常不同。我已经处理了我的自定义多维数据集,并开发了一种特殊的计算方法

它有什么作用?

那么,它表示在某个级别(周、月、年)内的所有周是否都没有空值,并统计满足条件的店铺数量

我现在的黑客:

WITH 
MEMBER [Measures].[Shop WBC]
AS SUM
([Shop].[Shop ID].[Shop ID].Members,
(IIF((Filter(Descendants([Time].[Week calendar], [Time].[Week calendar].[Week]),
[Measures].[Sales] IS NULL).Count) > 0, NULL, 1))
)
我的测试选择:

SELECT 
([Time].[Week calendar].[Week]) ON ROWS, 
([Shop].[Geo].[Region].Members, [Measures].[Shop WBC]) ON COLUMNS
FROM [Testable]
WHERE [Time].[Week].&[201301]:[Time].[Week].&[201319]
对于每个店铺,它只返回1(不为空),因此是店铺总数

但是,它在所有周内返回相同的值(仅1个)。为什么失败了?我想我不明白在这种情况下或其他情况下,子体函数是如何工作的?我错过了什么?希望我的解释不是那么不清楚


提前谢谢

按照您编写查询的方式,行中的周数与结果无关,因为您的
Filter
语句覆盖了
周日历
层次结构的上下文。您应该将查询编写为

WITH 
MEMBER [Measures].[Shop WBC]
AS SUM
([Shop].[Shop ID].[Shop ID].Members,
IIF((Filter(EXISTING [Time].[Week calendar].Members, [Measures].[Sales] IS NULL).Count > 0, NULL, 1)
)
SELECT 
([Time].[Week calendar].[Week]) ON ROWS, 
([Shop].[Geo].[Region].Members, [Measures].[Shop WBC]) ON COLUMNS
FROM [Testable]
WHERE [Time].[Week].&[201301]:[Time].[Week].&[201319]
此外,在MDX中,
WHERE
子句的使用频率远低于SQL。而且,从形式上讲,MDX首先声明行是非法的。正确的MDX首先声明列,然后声明行。但是,AnalysisServices在这里是允许的。我将把上面的查询重写为

WITH 
MEMBER [Measures].[Shop WBC]
    AS SUM(
    [Shop].[Shop ID].[Shop ID].Members,
    IIF((Filter(EXISTING [Time].[Week calendar].Members, [Measures].[Sales] IS NULL).Count > 0, NULL, 1)
    )
SELECT 
    [Shop].[Geo].[Region].Members
    * { [Measures].[Shop WBC] }
ON COLUMNS,
    [Time].[Week calendar].&[201301] : [Time].[Week calendar].&[201319]
ON ROWS
FROM [Testable]

我想您打算说
(筛选(后代([Time].[Week calendar],[Time].[Week calendar].[Week]),[Measures].[Sales]为空)。计数
。我不确定您为什么使用
[Measures].[Sales]
作为
过滤器的第二个参数
。的确。很好的捕获,谢谢。不幸的是,这不会影响输出。编辑了代码。你能发布完整的语句吗,包括你正在使用的SELECT,WHERE,FrankPl,当然,更新了我以前的帖子。谢谢你的工作和时间!但我以前已经写过类似的东西了ore.不过我希望它可以处理所有级别(月、年等)。这就是为什么我使用了后代和筛选器以及[Time].[Week calendar]。CurrentMember在这种情况下是无用的。:(@Kedny88您是指行上的“所有级别”还是度量定义中的“所有级别”?嗯,我想获取特定级别(在我的情况下是周)的集合)。对于周级别,它将获得一个成员,但对于月级别,它将返回4个成员。我必须检查集合中是否包含任何Null,如果为true,则返回Null。如果集合中没有[Measures].[Sales]的空值它返回1。然后对他们的数字求和。这对你更有意义吗?@Kedny88我编辑了我的答案,使用
现有的
,它检查上下文,但不会覆盖它。是的,谢谢,它很慢,但很有效。有什么优化吗?