如何递归计数在层次结构中包含NULL值的特定级别成员

时间:2013-12-12 16:48:05

标签: mdx olap cube

在潜入MDX时我遇到了一个误解。它与常规SQL有很大不同。我已经处理了我的自定义立方体并开发了一个特殊的计算量度。

它做了什么?

嗯,它表示在某个级别(周,月,年)内的所有周数是否都没有NULL,以及满足条件的商店数量。

我目前的黑客攻击:

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(不是NULL),因此商店总和。

然而,它返回所有周的相同值(仅限1)。为什么会失败?我想我不知道 Descendants 功能在这种情况下是怎么起作用的?我错过了什么?希望我的解释不是那么清楚。

提前致谢!

1 个答案:

答案 0 :(得分:0)

您编写查询的方式,行的周数与结果无关,因为Filter语句会覆盖Week calendar层次结构的上下文。您应该将查询编写为

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首先列出列,然后是行。但是,Analysis Services在此容忍。我会将上述查询重写为

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]