如果不是一个问题,创建如下立方体级成员:
CREATE
MEMBER [Measures].[Percentage of All Accounts] AS NULL;
SCOPE(
{
{ [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
[Assets Cont].[Contract Status].&[C1]
});
[Measures].[Percentage of All Accounts] =
Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR]);
END SCOPE;
另外,在查询中使用的NonEmpty()
功能摆脱不必要crossjoins的。
SELECT
NON EMPTY
{
[Measures].[SUM Principal EUR],
[Measures].[SUM Principal USD],
[Measures].[SUM Principal Local Currency],
[Measures].[Percentage of All Accounts]
} ON COLUMNS,
NON EMPTY
NonEmpty(
[Contract].[Product Group].ALLMEMBERS,
[Dates].[YearMonth].ALLMEMBERS
) ON ROWS
FROM
(
SELECT
{ (
STRTOSET(@ContractProductGroup, CONSTRAINED),
STRTOSET(@DatesYearMonth, CONSTRAINED)
) } ON 0
FROM [Assets]
)
编辑 - WHERE子句,而不是子选择
WITH MEMBER [Measures].[Percentage of All Accounts] AS
[Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR])
SELECT
NON EMPTY
{
[Measures].[SUM Principal EUR],
[Measures].[SUM Principal USD],
[Measures].[SUM Principal Local Currency],
[Measures].[Percentage of All Accounts]
} ON COLUMNS,
NON EMPTY
{ (
[Contract].[Product Group].ALLMEMBERS,
[Dates].[YearMonth].ALLMEMBERS
) } ON ROWS
FROM [Assets]
WHERE
{
{ [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
[Assets Cont].[Contract Status].&[C1],
STRTOSET(@ContractProductGroup, CONSTRAINED),
STRTOSET(@DatesYearMonth, CONSTRAINED)
}
EDIT 2
WITH MEMBER [Measures].[Percentage of All Accounts] AS
[Measures].[SUM Principal EUR]
/
SUM({[Contract].[Product Group].&[P1], [Contract].[Product Group].&[P2], [Contract].[Product Group].&[P3]}, [Measures].[SUM Principal EUR])
SELECT
NON EMPTY
{
[Measures].[SUM Principal EUR],
[Measures].[SUM Principal USD],
[Measures].[SUM Principal Local Currency],
[Measures].[Percentage of All Accounts]
} ON COLUMNS,
NON EMPTY
{ (
STRTOSET(@ContractProductGroup, CONSTRAINED),
STRTOSET(@DatesYearMonth, CONSTRAINED)
) } ON ROWS
FROM [Assets]
WHERE
{
{ [Contract].[Unit].&[U1], [Contract].[Unit].&[U2], [Contract].[Unit].&[U3] },
[Assets Cont].[Contract Status].&[C1]
}
谢谢您的建议。我刚刚做到了这一点,但不幸的是没有注意到任何时间的改进。 – irusul 2015-03-31 14:20:11
@irusul - 让我编辑我的脚本,因为我认为我可以看到一个问题 - 您的“ON ROWS”代码很奇怪 - 为什么不直接进行正常的交叉连接? – whytheq 2015-03-31 14:52:50
这是交叉连接的另一种方式,无论如何,性能是相同的。 – irusul 2015-03-31 14:59:26