2017-01-25 8 views
1

У меня есть запрос mdx, который я использую в отчете SSRS. Я хотел бы вернуть только часы, которые составляют> 50, но я хотел бы показывать все годы независимо от того, есть ли данные за этот год. Я могу заставить фильтр> 50 работать, но потом я теряю годы, когда нет данных. Я пробовал ставить годы на оси «Страницы», которая затем возвращает все годы, но ось моих строк больше не уважает фильтр, когда я это делаю. Я также попытался поставить измерение лет за пределами предложения NONEMPTY, но опять же не соблюдает фильтр> 50 часов.
Вот пример того, что у меня до сих пор:MDX - включает как пустые, так и непустые

SELECT 
    [measures].[Hours] ON COLUMNS 
, 
    [Date].[Year].[Year].ALLMEMBERS 
    * 
    { 
     Filter 
     (
     NonEmpty 
     (
      CrossJoin 
      (
      [Client].[Client].[Client].ALLMEMBERS 
      ,[Department].[Department].[Department].ALLMEMBERS 
      ,[Title].[Title].[Title].ALLMEMBERS 
      ,[Person].[Person].[Person].ALLMEMBERS 
     ) 
     ,[Measures].[Billable Hours] 
     ) 
     , 
     [Measures].[Billable Hours] >= 50 
    ) 
    } ON ROWS 
FROM TestCube; 

Желаемый результат был бы еще показать 2017 колонки, даже если нет никаких данных, а только показать часы> 50 для столбцов, которые имеют данные.

Любая помощь по этому вопросу была бы высоко оценена. Я нашел способ обойти это, создав вычисляемый элемент, который проверяет часы> 50, иначе возвращает null. Просто интересно, есть ли лучший способ сделать это.

Спасибо, Хиллари

+0

Каковы будут результаты? – whytheq

ответ

0

Вы можете попробовать добавить OR ISEMPTY([Measures].[Billable Hours]) в условие фильтра:

SELECT 
    [measures].[Hours] ON COLUMNS 
, 
    [Date].[Year].[Year].ALLMEMBERS 
    * 
    { 
     Filter 
     (
     NonEmpty 
     (
      CrossJoin 
      (
      [Client].[Client].[Client].ALLMEMBERS 
      ,[Department].[Department].[Department].ALLMEMBERS 
      ,[Title].[Title].[Title].ALLMEMBERS 
      ,[Person].[Person].[Person].ALLMEMBERS 
     ) 
     ,[Measures].[Billable Hours] 
     ) 
     , 
     [Measures].[Billable Hours] >= 50 
      OR ISEMPTY([Measures].[Billable Hours]) 
    ) 
    } ON ROWS 
FROM TestCube; 
+1

Спасибо за это! Я не понимал, что могу использовать функцию ИЛИ. – HBetts

0

можно перемещать алгоритм в вычисляемой меры. Это быстрее. Функция фильтра работает медленно.

with 
Member [Measures].[Billable Hours 50More] as 
IIF([Measures].[Billable Hours] >= 50, [Measures].[Hours], NULL)  

select 
[Measures].[Billable Hours 50More] on 0, 
[Date].[Year].[Year].AllMembers * NonEmpty([Client].[Client].[Client].AllMembers * [Department].[Department].[Department].AllMembers * [Title].[Title].[Title].AllMembers * [Person].[Person].[Person].AllMembers, [Billable Hours 50More]) on 1 

from TestCube 
+0

Спасибо за это. На самом деле это то, с чем я столкнулся. Очень признателен! – HBetts