我在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].&[1]&[2019]&[TR-1]</Value>
</Parameter>
答案 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]))))))))))