s-s-rS mdx 报告:在列上使用维度
Posted
技术标签:
【中文标题】s-s-rS mdx 报告:在列上使用维度【英文标题】:s-s-rS mdx report: use dimension on columns 【发布时间】:2015-06-22 08:49:04 【问题描述】:这个简单的 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]
这使它变得非常慢的部分 - 不是计算成员,它是行上 City 和 Sales_step 维度的交叉连接,我必须这样做(否则,City 仅在行上变暗, - 我在列上得到空结果)。有什么建议可以让我的 mdx 更快吗?
【问题讨论】:
出于兴趣:你有没有得到这个答案?***.com/questions/30568720/… 干杯 2whytheq!你说的对。一起使用 Filter() 和 Crossjoin() 函数时,我们应该非常小心。它通常使 mdx 非常慢。正如您所提议的那样,我已经用 subcube 请求替换了 Filter() 块 - 它使代码运行得更快。然后我用 IIF 替换了 CASE,效果也更好。我将发布一个新代码作为答案 【参考方案1】:这会产生相同的结果吗?是不是更快了?
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];
【讨论】:
我认为你在这个 sn-p 中的编码技术非常有趣,并且总体上可以在 mdx 脚本中使用。非常感谢您的帮助,谢谢!!! @Globe 不要害怕将其标记为答案!在其中一个逻辑分支上使用IIF
和NULL
意味着该措施在块模式下工作;这实际上是您问题的答案。
伙计,我确实想要像你这样的球。将其标记为答案
@Globe 赞赏。回到这个问题:为什么不只对列进行度量,对行进行交叉连接。然后在 s-s-rS 中使用矩阵,然后将每个度量选择到矩阵的每一行中......因此,有效地旋转数据。为什么这不起作用?
@Globe 嗨 - 希望你一切都好 - 应该很容易尝试 Extract
函数:它提供了从一组多维元组中提取指定层次结构的行为。 msdn.microsoft.com/en-us/library/ms145980.aspx【参考方案2】:
尝试在 s-s-rS 中使用以下查询。
SELECT [Measures].[Qnt] ON COLUMNS,
NonEmpty
(
[Sales_step].CHILDREN
*
[City], [Measures].[Qnt]
) ON ROWS
FROM [SALES_PIPE]
话虽如此,我假设您在这段代码上方声明了命名集[City]
。
【讨论】:
此代码生成具有 3 列的网格:Sales_step、City、Qnt。但我需要一种格式,如:城市、联系人、客户、资助。这就像 t-sql 中的 Pivot 命令或 Excel 中的转置 嗯。我给出这个答案的原因是因为你说你最早的尝试没有奏效。看来您希望优化第二个 MDX。 我需要两件事之一:(a) 强制短代码 sn-p 在 s-s-rS 中运行或 (b) 作为替代方案 - 使用计算成员优化繁重的代码 sn-p 并在行上交叉连接跑得快。在 SSMS 中,他们给出相同的 4 列结果:城市、联系人、客户、资助【参考方案3】:感谢@whytheq 提出的避免使用慢速 Filter() 函数和 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])
【讨论】:
以上是关于s-s-rS mdx 报告:在列上使用维度的主要内容,如果未能解决你的问题,请参考以下文章