这个简单的mdx查询在SSMS中起作用:
SELECT
CrossJoin({[Measures].[Qnt]},
{[Sales_step].CHILDREN}) ON COLUMNS,
[City] ON ROWS
FROM [SALES_PIPE]
但它无法在Visual Studio中为rdl报告运行。错误确定:
The query cannot be prepared: The query must have at least one axis.
The first axis of the query should not have multiple hierarchies,
nor should it reference any dimension other than the Measures dimension..
Parameter name: mdx (MDXQueryGenerator)
我找到了另一种检索结果的语法,但它的cols是硬编码的,而且脚本很慢:
WITH
MEMBER [Measures].[Contacts] AS
CASE WHEN [Sales_step].CURRENTMEMBER IS [Sales_step].&[contact]
THEN [Measures].[Qnt] ELSE null END
MEMBER [Measures].[Clients] AS
CASE WHEN [Sales_step].CURRENTMEMBER IS [Sales_step].&[client]
THEN [Measures].[Qnt] ELSE null END
MEMBER [Measures].[Funded] AS
CASE WHEN [Sales_step].CURRENTMEMBER IS [Sales_step].&[funded]
THEN [Measures].[Qnt] ELSE null END
SELECT {[Measures].[Contacts],
[Measures].[Clients],
[Measures].[Funded]} ON COLUMNS,
NON EMPTY
FILTER(crossjoin({[City].CHILDREN},
{[Sales_step].CHILDREN}),
[Measures].[Contacts] > 0 OR
[Measures].[Clients] > 0 OR
[Measures].[Funded] > 0) ON ROWS
FROM [SALES_PIPE]
部分,它使它非常慢 - 不是计算成员,它是城市和行上的Sales_step维度的交叉连接,我必须做(其他,只有城市昏暗的行, - 我得到列的空结果)。有什么建议我怎么能让我的mdx更快?
答案 0 :(得分:2)
这会给出相同的结果吗?它更快吗?
WITH
MEMBER [Measures].[Contacts] AS
Sum
(
IIF
(
[Sales_step].CurrentMember IS [Sales_step].&[contact],
,[Measures].[Qnt]
,null
)
)
MEMBER [Measures].[Clients] AS
Sum
(
IIF
(
[Sales_step].CurrentMember IS [Sales_step].&[client]
,[Measures].[Qnt]
,null
)
)
MEMBER [Measures].[Funded] AS
Sum
(
IIF
(
[Sales_step].CurrentMember IS [Sales_step].&[funded]
,[Measures].[Qnt]
,null
)
)
SET [yourMeasures] AS
{
[Measures].[Contacts]
,[Measures].[Clients]
,[Measures].[Funded]
}
SET [CitySales] AS
[City].Children * [Sales_step].Children
SET [CitySalesNonEmpty] AS
Union
(
NonEmpty([CitySales],[Measures].[Contacts])
,NonEmpty([CitySales],[Measures].[Clients])
,NonEmpty([CitySales],[Measures].[Funded])
)
/*
//>>>>Alternative syntax for above union>>
SET [CitySalesNonEmpty] AS
NonEmpty([CitySales],[Measures].[Contacts])
+NonEmpty([CitySales],[Measures].[Clients])
+NonEmpty([CitySales],[Measures].[Funded])
//>>>>
*/
SELECT
[yourMeasures] ON COLUMNS
,NON EMPTY
[CitySalesNonEmpty] ON ROWS
FROM [SALES_PIPE];
答案 1 :(得分:0)
尝试在SSRS中使用以下查询。
SELECT [Measures].[Qnt] ON COLUMNS,
NonEmpty
(
[Sales_step].CHILDREN
*
[City], [Measures].[Qnt]
) ON ROWS
FROM [SALES_PIPE]
话虽如此,我假设你在这段代码之上声明了名为[City]
的集合。
答案 2 :(得分:0)
感谢@ whytheq建议避免使用慢速Filter()func和CASE条件 - 我在这里发布了一个新的优化代码,包含子多维数据集请求和IIF条件。它运行得更快:
WITH
MEMBER [Measures].[Contacts] AS
IIF([Sales_step].CURRENTMEMBER IS [Sales_step].&[contact], [Measures].[Qnt], null)
MEMBER [Measures].[Clients] AS
IIF([Sales_step].CURRENTMEMBER IS [Sales_step].&[client], [Measures].[Qnt], null)
MEMBER [Measures].[Funded] AS
IIF([Sales_step].CURRENTMEMBER IS [Sales_step].&[funded], [Measures].[Qnt], null)
SELECT {[Measures].[Contacts],
[Measures].[Clients],
[Measures].[Funded]} ON COLUMNS,
NON EMPTY
crossjoin({[City].CHILDREN},
{[Sales_step].CHILDREN}) ON ROWS
FROM ( SELECT ( [Sales_step].MEMBERS ) ON COLUMNS
FROM [SALES_PIPE])