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

How to get former year using MDX expression

我在 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)

但在那之后,我无法像以前那样在行中使用它。

如何实现? (见解和 "how to" 解释将不胜感激!)

更新

请注意,问题中的 @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>

您可以使用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写成

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

如果以上方法不起作用,请编辑您的问题以显示表达式的文本值

SELECT ( STRTOSET(@pYear, CONSTRAINED)

基于以上修改 WITH MEMBER [Measures].[Comision] 作为 [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).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]))))))))))

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

想法是将值作为 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],
... }

就是这样。现在你的数据集中有前一年的值。