2015-06-22 3 views
2

Этот простой MDX запрос работают в SSMS:SSRS отчет MDX: использование размер столбцов

SELECT 
CrossJoin({[Measures].[Qnt]}, 
      {[Sales_step].CHILDREN}) ON COLUMNS, 
[City] ON ROWS 
FROM [SALES_PIPE] 

Но не запускается в Visual Studio для отчета RDL. Ошибка accures:

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) 

Я нашел другой синтаксис для получения результатов, но это смещ_по_столбцы жестко закодированы и сценарий медленно:

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 dim только по строкам, - я получаю нулевые результаты по столбцам). Любые предложения, как я могу сделать мой mdx быстрее?

+0

Из интереса: Вы когда-нибудь получить ответ на этот HTTP: //stackoverflow.com/questions/30568720/mdx-generate-hierarchy-level-within-rdl-report – whytheq

+0

Приветствия 2whytheq! Ты прав. Мы должны быть очень осторожны при совместном использовании функций Filter() и Crossjoin(). Это часто делает mdx очень медленным. Как вы любезно предложили, я заменил блок Filter() на запрос subcube - и он заставил код работать намного быстрее. Затем я заменил CASE на IIF, и все получилось лучше. Я отправлю новый код в качестве ответа – Globe

ответ

2

Это дает те же результаты? Это быстрее?

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]; 
+0

Я считаю, что ваша кодирующая техника в этом фрагменте очень интересна и полезна для использования в сценариях mdx в целом. Я очень ценю вашу помощь, спасибо! – Globe

+0

@Globe не бойтесь отметить это как ответ! Использование 'IIF' с' NULL' на одной из ветвей логики означает, что эта мера работает в блочном режиме; это был ответ на ваш вопрос. – whytheq

+1

Мужчина, мне нужны такие яйца, как твои. Отмечено это как ответ – Globe

0

Попробуйте использовать следующий запрос в SSRS.

SELECT [Measures].[Qnt] ON COLUMNS, 
NonEmpty 
     (
     [Sales_step].CHILDREN 
     * 
     [City], [Measures].[Qnt] 
     ) ON ROWS  
FROM [SALES_PIPE] 

Сказав это, я предполагаю, что вы объявляете именованный набор [City] выше этого бита кода.

+0

Этот код создает сетку с тремя столбцами: Sales_step, City, Qnt. Но мне нужен формат: City, Contacts, Clients, Funded. Это как команда Pivot в t-sql или транспонирование в Excel – Globe

+0

Хмм. Причина, по которой я дал этот ответ, состоит в том, что вы сказали, что ваша самая ранняя попытка не сработала. Кажется, вы хотите, чтобы второй MDX был оптимизирован. – SouravA

+0

Мне нужна любая из двух вещей: (a) заставить короткий фрагмент кода работать в SSRS или (b) в качестве альтернативы - оптимизировать фрагмент кода с вычисленными членами и скрещивать строки для быстрого запуска. В SSMS они дают тот же результат из 4 колод: City, Contacts, Clients, Funded – Globe

0

Благодаря @ whytheq-й предложение, чтобы избежать использования медленного фильтра() FUNC и СЛУЧАЙ условия - я отправляю новый оптимизированный код здесь с запросом и состоянием вложенного куба 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]) 
Смежные вопросы