使用来自 Excel 客户端的 Subselect MDX 更改上下文
Change the context with Subselect MDX from Excel client
我有两个时间维度,生产周期和会计周期,以及一个度量值,当用户从 excel 查询多维数据集时,我想与其中一个维度而不是两个维度进行聚合。为此,我创建了一个标志度量来检查是否同时使用了两个维度
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[DIM Accounting Period].[Accounting Period Hierarchy].CURRENTMEMBER.level.ordinal <> 0 and
[DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal = 0 ,
1,
IIF ( [DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal <> 0 and
[DIM Accounting Period].[Accounting Period Hierarchy].currentmember.level.ordinal = 0 ,
2,
3
)
), VISIBLE =0;
然后我使用这个标志来创建我的度量
CREATE MEMBER CURRENTCUBE.[Measures].[Sales/day] AS
IIF([Measures].[AcctProdFlag] = 1 ,
([Measures].[Sales] / [Measures].[Accounting Period Day Count]),
IIF([Measures].[AcctProdFlag] = 2,
([Measures].[Sales] / [Measures].[Production Period Day Count]),
"NA")),
VISIBLE = 1, DISPLAY_FOLDER = 'Sales\Daily' , FORMAT_STRING = "#,###";
当我使用来自 Management Studio 的查询时,它正常工作并且 returns "NA" 正如预期的那样,因为两个维度都被使用
SELECT {[Measures].[Sales/day]} ON COLUMNS ,
[DIM Production Period].[Production Month].MEMBERS ON ROWS
FROM [My Cube]
WHERE {[DIM Accounting Period].[Accounting Year].[2014],
[DIM Accounting Period].[Accounting Year].[2015]};
但是,当我在 excel 中添加会计年度进行过滤并在行中添加生产期间时,当我 select 多个会计年度时,度量显示值(它不应该按照逻辑)但是当我 select 一个会计年度时显示 "NA" (正如预期的那样)。事实证明,当我 select 多年后,excel 将以下查询发送到 SSAS,导致它丢失上下文
SELECT {[Measures].[Sales/day]} ON COLUMNS ,
[DIM Production Period].[Production Month].MEMBERS ON ROWS
FROM (SELECT (
{[DIM Accounting Period].[Accounting Year].[2014],[DIM Accounting Period].[Accounting Year].[2015]}
) ON COLUMNS
FROM [My Cube]
)
我能做些什么来解决这个问题吗?我正在为 SQL Server 2008 R2 和 Excel 2013 使用 SSAS。
一种方法是动态命名集,如 "Using dynamic sets to detect subselects" 部分中 post 所述。
另一种方法是在仅连接到该维度的 DimAccountingPeriod 之上构建一个度量值组并构建一个计数度量值。然后测试Dim Accounting Period是否没有过滤器:
IIf(
[Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All])
,1
,0
)
进一步扩展您将如何使用它:
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[Measures].[Accounting Period Count] < ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) and
[Measures].[Production Period Count] = ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) ,
1,
IIF ( [Measures].[Production Period Count] < ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) and
[Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) ,
2,
3
)
), VISIBLE =0;
您可以尝试动态集方法,但度量方法的效果最好。
所以我最终做了以下事情来解决这个问题。我在数据源视图中创建了两个度量为 NULL 并调用了它们; [Measures].[Prod Months Used]
和 [Measures].[Acct Months Used]
我还创建了计算成员来计算所有生产月份和所有会计月份。那些工作是这样的
-- 创建此度量是为了计算立方体中的生产月数
CREATE MEMBER CURRENTCUBE.[Measures].[AllProdMonths] AS
SUM(
DESCENDANTS(
[DIM Production Period].[Production Month Hierarchy].[All],
[DIM Production Period].[Production Month Hierarchy].[Production Month], SELF
)
, 1
), VISIBLE=0 ;
-- This measure is created to count the number of accounting months in the cube
CREATE MEMBER CURRENTCUBE.[Measures].[AllAcctMonths] AS
SUM(
DESCENDANTS(
[DIM Accounting Period].[Accounting Period Hierarchy].[All],
[DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month], SELF
)
, 1
), VISIBLE =0;
最后,为了计算使用的会计月数和生产月数,我执行了以下操作:
-- This measure is scoped to count the number of used Production months in excel (including filters)
-- It does that by overwritting all values except the All member.
SCOPE (
([Measures].[Prod Months Used],
[DIM Production Period].[Production Month Hierarchy].[Production Month].MEMBERS)
);
SCOPE DESCENDANTS(
[DIM Production Period].[Production Month Hierarchy].[All],, AFTER
);
THIS = 1;
END SCOPE;
END SCOPE;
-- This measure is scoped to count the number of used Accounting months in excel (including filters)
-- It does that by overwritting all values except the All member.
SCOPE (
([Measures].[Acct Months Used],
[DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month].MEMBERS)
);
SCOPE DESCENDANTS(
[DIM Accounting Period].[Accounting Period Hierarchy].[All],, AFTER
);
THIS = 1;
END SCOPE;
END SCOPE;
我的标志将根据以下表达式进行评估
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[Measures].[Acct Months Used] < [Measures].[AllAcctMonths] AND
[Measures].[Prod Months Used] = [Measures].[AllProdMonths],
1,
IIF ( [Measures].[Acct Months Used] = [Measures].[AllAcctMonths] AND
[Measures].[Prod Months Used] < [Measures].[AllProdMonths] ,
2,
3
)
), VISIBLE =0;
此解决方案运行良好,性能非常好。
我有两个时间维度,生产周期和会计周期,以及一个度量值,当用户从 excel 查询多维数据集时,我想与其中一个维度而不是两个维度进行聚合。为此,我创建了一个标志度量来检查是否同时使用了两个维度
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[DIM Accounting Period].[Accounting Period Hierarchy].CURRENTMEMBER.level.ordinal <> 0 and
[DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal = 0 ,
1,
IIF ( [DIM Production Period].[Production Month Hierarchy].currentmember.level.ordinal <> 0 and
[DIM Accounting Period].[Accounting Period Hierarchy].currentmember.level.ordinal = 0 ,
2,
3
)
), VISIBLE =0;
然后我使用这个标志来创建我的度量
CREATE MEMBER CURRENTCUBE.[Measures].[Sales/day] AS
IIF([Measures].[AcctProdFlag] = 1 ,
([Measures].[Sales] / [Measures].[Accounting Period Day Count]),
IIF([Measures].[AcctProdFlag] = 2,
([Measures].[Sales] / [Measures].[Production Period Day Count]),
"NA")),
VISIBLE = 1, DISPLAY_FOLDER = 'Sales\Daily' , FORMAT_STRING = "#,###";
当我使用来自 Management Studio 的查询时,它正常工作并且 returns "NA" 正如预期的那样,因为两个维度都被使用
SELECT {[Measures].[Sales/day]} ON COLUMNS ,
[DIM Production Period].[Production Month].MEMBERS ON ROWS
FROM [My Cube]
WHERE {[DIM Accounting Period].[Accounting Year].[2014],
[DIM Accounting Period].[Accounting Year].[2015]};
但是,当我在 excel 中添加会计年度进行过滤并在行中添加生产期间时,当我 select 多个会计年度时,度量显示值(它不应该按照逻辑)但是当我 select 一个会计年度时显示 "NA" (正如预期的那样)。事实证明,当我 select 多年后,excel 将以下查询发送到 SSAS,导致它丢失上下文
SELECT {[Measures].[Sales/day]} ON COLUMNS ,
[DIM Production Period].[Production Month].MEMBERS ON ROWS
FROM (SELECT (
{[DIM Accounting Period].[Accounting Year].[2014],[DIM Accounting Period].[Accounting Year].[2015]}
) ON COLUMNS
FROM [My Cube]
)
我能做些什么来解决这个问题吗?我正在为 SQL Server 2008 R2 和 Excel 2013 使用 SSAS。
一种方法是动态命名集,如 "Using dynamic sets to detect subselects" 部分中 post 所述。
另一种方法是在仅连接到该维度的 DimAccountingPeriod 之上构建一个度量值组并构建一个计数度量值。然后测试Dim Accounting Period是否没有过滤器:
IIf(
[Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All])
,1
,0
)
进一步扩展您将如何使用它:
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[Measures].[Accounting Period Count] < ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) and
[Measures].[Production Period Count] = ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) ,
1,
IIF ( [Measures].[Production Period Count] < ([Measures].[Production Period Count], [DIM Production Period].[Production Month Hierarchy].[All]) and
[Measures].[Accounting Period Count] = ([Measures].[Accounting Period Count], [DIM Accounting Period].[Accounting Period Hierarchy].[All]) ,
2,
3
)
), VISIBLE =0;
您可以尝试动态集方法,但度量方法的效果最好。
所以我最终做了以下事情来解决这个问题。我在数据源视图中创建了两个度量为 NULL 并调用了它们; [Measures].[Prod Months Used]
和 [Measures].[Acct Months Used]
我还创建了计算成员来计算所有生产月份和所有会计月份。那些工作是这样的
-- 创建此度量是为了计算立方体中的生产月数
CREATE MEMBER CURRENTCUBE.[Measures].[AllProdMonths] AS
SUM(
DESCENDANTS(
[DIM Production Period].[Production Month Hierarchy].[All],
[DIM Production Period].[Production Month Hierarchy].[Production Month], SELF
)
, 1
), VISIBLE=0 ;
-- This measure is created to count the number of accounting months in the cube
CREATE MEMBER CURRENTCUBE.[Measures].[AllAcctMonths] AS
SUM(
DESCENDANTS(
[DIM Accounting Period].[Accounting Period Hierarchy].[All],
[DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month], SELF
)
, 1
), VISIBLE =0;
最后,为了计算使用的会计月数和生产月数,我执行了以下操作:
-- This measure is scoped to count the number of used Production months in excel (including filters)
-- It does that by overwritting all values except the All member.
SCOPE (
([Measures].[Prod Months Used],
[DIM Production Period].[Production Month Hierarchy].[Production Month].MEMBERS)
);
SCOPE DESCENDANTS(
[DIM Production Period].[Production Month Hierarchy].[All],, AFTER
);
THIS = 1;
END SCOPE;
END SCOPE;
-- This measure is scoped to count the number of used Accounting months in excel (including filters)
-- It does that by overwritting all values except the All member.
SCOPE (
([Measures].[Acct Months Used],
[DIM Accounting Period].[Accounting Period Hierarchy].[Accounting Month].MEMBERS)
);
SCOPE DESCENDANTS(
[DIM Accounting Period].[Accounting Period Hierarchy].[All],, AFTER
);
THIS = 1;
END SCOPE;
END SCOPE;
我的标志将根据以下表达式进行评估
CREATE MEMBER CURRENTCUBE.[Measures].[AcctProdFlag] AS
IIF (
[Measures].[Acct Months Used] < [Measures].[AllAcctMonths] AND
[Measures].[Prod Months Used] = [Measures].[AllProdMonths],
1,
IIF ( [Measures].[Acct Months Used] = [Measures].[AllAcctMonths] AND
[Measures].[Prod Months Used] < [Measures].[AllProdMonths] ,
2,
3
)
), VISIBLE =0;
此解决方案运行良好,性能非常好。