如何使用MDX表达式获得前一年

时间:2019-06-10 12:57:34

标签: ssas mdx

我在SSRS数据集中有一个有效的MDX查询,但不是我自己做的,其中包含以下几行:

ON COLUMNS FROM ( SELECT ( STRTOSET(@pYear, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pMonth, CONSTRAINED) ) 
...

一切正常。但是,我需要复制此数据集,以使另一个数据集具有与上一年相同的数据(减去一个)。

我尝试对其进行修改,遇到错误,然后learned关于MDX,直到现在我还不知道。但是,我无法确切了解它的工作原理以及上一年该如何获得。我已经阅读了很多文档,但是示例对我来说并不十分清楚。

我已经尝试过使用Sum函数,但是我无法使其正常工作,因为我发现的所有示例都以with子句开头,而该子句在中间无法使用一个查询,加上这些示例似乎使用了members,但是我的查询使用的是sets(如果我没有误会的话)。

我一开始就尝试使用:

MEMBER [Measures].[Ano Prev] AS SUM(STRTOMEMBER(@pYear) , -1)

但是在那之后,我不能像以前的代码那样使用它。

如何实现? (见解和“如何做”的解释将不胜感激!)

更新

请注意,问题中的@pYear在查询中被翻译为@pEjercicio

完成原始查询:

WITH MEMBER [Measures].[Comision] AS [Measures].[Comision Once]*[Measures].[Importe] 

SELECT NON EMPTY { [Measures].[Importe], [Measures].[Unidades], [Measures].[N Tiendas], [Measures].[Comision Once] } ON COLUMNS, 


NON EMPTY { ([Tiempo].[Periodos].[Ano]*[Tiempo].[Meses].[Mes].ALLMEMBERS * [Productos].[Once Modalidad].[Once Modalidad].ALLMEMBERS ) } 


ON ROWS FROM ( SELECT (-{[Productos].[Cod-Producto].[Cod Producto].&[139972]} ) 


ON COLUMNS FROM ( SELECT ( STRTOSET(@pEjercicio, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pMes, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pSemana, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( -{ [Productos].[Once Modalidad].&[-] } ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pOrganizacion, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pDirectorRegional, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pCoordinadorComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoFranquicia, CONSTRAINED) ) 
ON COLUMNS FROM [Transacciones]))))))))))

基于答案的修改查询:

WITH MEMBER [Measures].[Comision] AS [Measures].[Comision Once]*[Measures].[Importe] 
MEMBER [Measures].[Ano Prev] AS SUM((STRTOMEMBER(@pEjercicio).PrevMember) , -1)

SELECT NON EMPTY { [Measures].[Importe], [Measures].[Unidades], [Measures].[N Tiendas], [Measures].[Comision Once] } ON COLUMNS, 


NON EMPTY { ([Tiempo].[Periodos].[Ano]*[Tiempo].[Meses].[Mes].ALLMEMBERS * [Productos].[Once Modalidad].[Once Modalidad].ALLMEMBERS ) } 


ON ROWS FROM ( SELECT (-{[Productos].[Cod-Producto].[Cod Producto].&[139972]} ) 

ON COLUMNS FROM ( select ( 
STRTOSET(@pEjercicio, CONSTRAINED).item(0).prevmember,
STRTOSET(@pEjercicio, CONSTRAINED).item(1)  ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pMes, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pSemana, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( -{ [Productos].[Once Modalidad].&[-] } ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pOrganizacion, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pDirectorRegional, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pCoordinadorComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoFranquicia, CONSTRAINED) ) 
ON COLUMNS FROM [Transacciones]))))))))))

一些探查器数据:

<Parameters xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns="urn:schemas-microsoft-com:xml-analysis">
        <Parameter>
          <Name>pEjercicio</Name>
          <Value xsi:type="xsd:string">-1</Value>
        </Parameter>
        <Parameter>
          <Name>pMes</Name>
          <Value xsi:type="xsd:string">[Tiempo].[Periodos].[Mes].&amp;[1]&amp;[2019]&amp;[TR-1]</Value>
        </Parameter>

2 个答案:

答案 0 :(得分:1)

这是我(在一些同事的指导下)解决该问题的方法,因为我最初的目标是拥有上一年的完整数据集。但是,此解决方案仅针对所需值,而不是完整的新数据集

这个想法是将值作为member获得,然后将其添加到columns中。

由于我需要获取上一年的信息(此处是问题的标题),因此我必须使用parallelperiod来获得今年的信息。此function的论点为正int,因为它表示滞后

MEMBER [Measures].[Your_Parameter_Previous_Year] AS ( PARALLELPERIOD( [Time].[Years].[Year] , 1 , [Time].[Years].CurrentMember ),[Measures].[Your_Parameter] )

如果您需要多个值,则需要准备所需数量的成员。

然后,您必须将其包含在select中,例如:

SELECT NON EMPTY { [ ...
[Measures].[Your_Parameter],
[Measures].[Your_Parameter_Previous_Year],
... }

就是这样。现在,您的数据集中有了上一年的值。

答案 1 :(得分:0)

您可以使用prevmember解决此问题。

MEMBER [Measures].[Ano Prev] AS SUM((STRTOMEMBER(@pYear).PrevMember) , -1)

ON COLUMNS FROM ( SELECT ( STRTOSET(@pYear, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pMonth, CONSTRAINED) ) 

在上面的代码中,将选择写为

select 
( 
STRTOSET(@pYear, CONSTRAINED).item(0).prevmember,
STRTOSET(@pYear, CONSTRAINED).item(1)
)

如果上述方法无效,请编辑您的问题以显示表达式的文本值

SELECT ( STRTOSET(@pYear, CONSTRAINED)

基于上面的修改     WITH MEMBER [Measures]。[Comision] AS [Measures]。[Comision一次] * [Measures]。[Importe]

SELECT NON EMPTY { [Measures].[Importe], [Measures].[Unidades], [Measures].[N Tiendas], [Measures].[Comision Once] } ON COLUMNS, 


NON EMPTY { ([Tiempo].[Periodos].[Ano]*[Tiempo].[Meses].[Mes].ALLMEMBERS * [Productos].[Once Modalidad].[Once Modalidad].ALLMEMBERS ) } 


ON ROWS FROM ( SELECT (-{[Productos].[Cod-Producto].[Cod Producto].&[139972]} ) 


ON COLUMNS FROM ( SELECT ( STRTOSET(@pEjercicio, CONSTRAINED).item(0).prevmember ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pMes, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pSemana, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( -{ [Productos].[Once Modalidad].&[-] } ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pOrganizacion, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pDirectorRegional, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pCoordinadorComercial, CONSTRAINED) ) 
ON COLUMNS FROM ( SELECT ( STRTOSET(@pTecnicoFranquicia, CONSTRAINED) ) 
ON COLUMNS FROM [Transacciones]))))))))))