Как получить предыдущий год, используя выражение MDX - PullRequest
0 голосов
/ 10 июня 2019

У меня есть рабочий MDX запрос в наборе данных SSRS, не сделанный мной, в котором есть следующие строки:

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

Все работает нормально.Тем не менее, Мне нужно продублировать этот набор данных, чтобы иметь другой набор данных с теми же данными, но из предыдущего года (вычесть один).

Я попытался изменить его, получил ошибку изатем узнал о 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 ]

1 голос
/ 11 июня 2019

Я решил эту проблему (под руководством коллеги) с небольшим количеством обходного пути, поскольку сначала я стремился получить полный набор данных за предыдущий год.Однако это решение предназначено только для нужных значений вместо полного нового набора данных .

Идея состоит в том, чтобы получить значение как member, а затем добавить его к columns.

Поскольку мне нужно получить его за предыдущий год (название вопроса здесь), я должен использовать parallelperiod, чтобы получить этот год.Аргументом для этой функции является положительный 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],
... }

И это все.Теперь в вашем наборе данных есть значения за предыдущий год.

0 голосов
/ 10 июня 2019

Вы можете использовать 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)

Основано на редактировании выше С ЧЛЕНОМ [Меры]. [Комиссия] КАК [Меры]. [Комиссия однажды] * [Меры]. [Импорт]

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]))))))))))
...