关于一个MDX的问题,SET对维度无效

0
我现在在做一个计算 两个用户集合中的共有集的操作

SET AAA AS
NONEMPTY({..},.)


SET BBB AS
NONEMPTY({..},.)


然后我在创建一个共有集合

MEMBER . AS
COUNT(INTERSECT(AAA ,BBB))

MDX:
SELECT
{
.
} ON COLUMNS,
{
..
} ON ROWS
FROM
(
SELECT ..&:..& ON COLUMNS
FROM
)

执行后发现 我的日期维度没有任何作用, BCount计算单元全部都是一样的值。

但是修改计算单元为:

MEMBER . AS 0
COUNT(INTERSECT(
NONEMPTY({..},.)
,NONEMPTY({..},.)))

这样日期维度就会起到作用,但是效率很低。
已邀请:
0

BIWORK - 热衷于微软BI技术,技术架构和解决方案! 2014-01-01 回答

我不能确定我是否真正理解了你的逻辑需求,但是下面我用类似的代码描述一段逻辑,你看看是不是和你差不多。重点就是在 COUNT 里加 EXISTING 关键字,如果不加的话就没有上下文了,从 ...Members 过去的成员不能起到上下文的作用。

WITH
SET AAA AS
NONEMPTY(
{...Members},
{.}
)
SET BBB AS
NONEMPTY(
{...Members},
{.}
)
MEMBER .
AS
COUNT(EXISTING INTERSECT(AAA,BBB))
SELECT . ON COLUMNS,
...MEMBERS *
{...Members} ON ROWS
FROM
(
SELECT (
...&:
...&
)ON COLUMNS
FROM
)

这端代码的逻辑就是在指定的时期范围内统计每一个月中各个子类产品哪些既有 Reseller Sales 的销售记录,同时又有 Internet Sales 的销售记录。MapCount 为 1 的就是都找到了销售记录,为0的表示没有销售记录。
1.png


0

BIWORK - 热衷于微软BI技术,技术架构和解决方案! 2014-01-02 回答

我后来也在 MSDN SSAS 论坛上问过这个问题,得到的解释是 SET 集合只会被计算一次,但是计算成员会根据不同的成员或者维度动态计算。当然我对这个答复也持有保留意见,但目前也暂时只能这么来理解。
我在我自己的测试 MDX 语句中和你一样使用两个 SET 集合,然后在计算成员中使用到 SET。

WITH
SET AAA AS
NONEMPTY(...MEMBERS,
(.,..,..CurrentMember)
)
SET BBB AS
NONEMPTY(...MEMBERS,
(.,..,..CurrentMember)
)
MEMBER . AS
COUNT(INTERSECT(AAA,BBB))
SELECT . ON COLUMNS,
...MEMBERS ON ROWS
FROM
(
SELECT (
...&&:
...&&
)ON COLUMNS
FROM
)

结果如下-
2.png


然后换成计算成员中的计算写法 -

WITH
MEMBER . AS
COUNT(
INTERSECT(
NONEMPTY(...MEMBERS,
(.,..)
),
NONEMPTY(...MEMBERS,
(.,..)
)
)
)
SELECT . ON COLUMNS,
...MEMBERS ON ROWS
FROM
(
SELECT (
...&&:
...&&
)ON COLUMNS
FROM
)

结果确实是正确的 -
1.png

通过这两种方式来比较,正确的做法还是应该写在计算成员中。即使 SET 也能支持这种动态计算,但我觉得效率方面不会有特别大的改善,因为它们都是先过滤成员,然后 INTERSECT 操作,本质上和放在计算成员里操作是一样的。

要回复问题请先登录注册