2015-01-08 3 views
0

Я учусь на работе. У меня есть таблица минут на каждой кровати. Я хочу рассчитать процентное использование кроватей. Я создал вычисляемый элемент в моем кубе в SSAS 2008SSAS Cube вычисляемый сумма участников неверно

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg( 
    crossjoin(
     descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) 
    ,descendants([Date].[date].currentmember, [Date].[Day]) 
    ) 
    ,[Measures].[Utilisation Mins] 
    ) 
/(24*60), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

Это на самом деле работает отлично, если я порезать на год/месяц или подопечного/кровать.

Но общее использование, указанное в браузере куба, неверно. Как я могу контролировать способ вычисления общей суммы использования? Могу ли я создать расчетный элемент таким образом, чтобы скрещивание работало на более высоком уровне, чем лист?

January 2011 Utilisation % 
  • Bed1 98.86%
  • Bed2 88,38%
  • Bed3 82,63%
  • Bed4 94,67%
  • Bed5 85,82%
  • Bed6 93,53%
  • Bed7 78,78%
  • Bed8 85,43%
  • Bed9 91,16%
  • Bed10 90,93%
  • Bed11 92,00%
  • Всего 894,35% < --- это слишком неправильно.

- добавил после комментария МЭЗ в

Ok, спасибо за подсказку. Я попробовал назначение по назначению после этого

SCOPE([Measures].[Utilisation Percentage]);  
    SCOPE([Date].[Date].MEMBERS);  
     SCOPE([bedlabel].[hierarchy].MEMBERS);  
      THIS = [Measures].[Utilisation Mins]/
        (60*24 
        * count(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel])) 
        * count(descendants([Date].[date].currentmember, [Date].[Day]))) ;  
     END SCOPE;  
    END SCOPE;  
END SCOPE; 

Я получил те же результаты, что и с помощью метода crossjoin. Я не вижу разницы в AS2008 между итоговым результатом назначения и моим старым методом crossjoin? И это все еще насчитывает в сюрреалистических цифрах, которые я не могу объяснить.

+0

Взгляните на эту ссылку (например) http://www.purplefrogsystems.com/blog/2009/11/scope-problems-with-mdx-calculated-members/. Возможно, вам понадобится использовать функцию SCOPE на основе вашего измерения даты. – Mez

+0

Если вы можете перестроить это в Adventure Works, я найду решение для вас. –

+0

Его неловко, но я никогда не работал с Adventure Works раньше, и я не мог сейчас найти эквивалент производительности с первого взгляда? – Pho

ответ

1

Это перестановка того, что предложил Sourav_Agasti, и он работает сейчас. Я думаю, что avg + nonemptycrossjoin работал лучше, чем avg + coalesceempty.

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg(nonemptycrossjoin(
     descendants([bedlabel].[hierarchy].currentmember,[bedlabel].[hierarchy].[Bedlabel]) 
     ,descendants([Date].[date].currentmember,[date].[date].[day])) 
     , [Measures].[Utilisation Mins]/ (24*60)), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay'; 

Это также сработало на основе предложения MEZ.

SCOPE([Measures].[Utilisation Percentage]); 
    scope ([bedlabel].[hierarchy].members); 
     scope ([date].[date].members);  
      this = avg(nonemptycrossjoin(
      descendants([bedlabel].[hierarchy].currentmember,[bedlabel].[hierarchy].[Bedlabel]) 
      ,descendants([Date].[date].currentmember,[date].[date].[day])) 
      , [Measures].[Utilisation Mins]/ (24*60)) ; 
      non_empty_behavior (this) = [Utilisation Mins] ; 
     end scope; 
    end scope; 
END SCOPE; 

Разница в AS2000 является то, что я только сделать это, а также указать, в среднем, как метод агрегирования на вычисляемой меры. У меня также не было множественной иерархии. Синтаксис для меня намного проще.

avg(nonemptycrossjoin(descendants([Unit].currentmember,[Unit].[Bed label]),descendants([Date].currentmember,[date].[day])), [Measures].[Utilisation Min]/ (24*60)) * 100' 

Благодарим за всех, кто пытался помочь!

+0

Рад, что у вас есть решение. В равной степени смущало, почему это сработало, и «CoalesceEmpty» этого не сделал. Надеюсь, кто-то может объяснить. – SouravA

+0

Я также не понимаю, почему один работал, а другой - нет. Лучшее, что я мог найти в Интернете, это ссылка http://technet.microsoft.com/en-us/library/aa224802(v=sql.80).aspx, однако, я не понимаю, что лучше прочитал. – Pho

0

Возможно, это связано с тем, что пустые кортежи создают проблемы. Использование CoalesceEmpty функции заменит пустые ячейки с 0. Попробуйте код ниже:

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationPercent 
AS avg(crossjoin(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]), 
descendants([Date].[date].currentmember, [Date].[Day])), CoalesceEmpty([Measures].[Utilisation Mins], 0)) 
/(24*60), 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

С момента AVG не кажется, не работает, проверьте ниже сценарий слишком:

CREATE MEMBER CURRENTCUBE.[Measures].a 
as 
SUM(
(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) * descendants([Date].[date].currentmember, [Date].[Day])), 
[Measures].[Utilisation Mins]), 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

CREATE MEMBER CURRENTCUBE.[Measures].b 
as 
COUNT(
(descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) * descendants([Date].[date].currentmember, [Date].[Day])) 
,EXCLUDEEMPTY 
), 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 

CREATE MEMBER CURRENTCUBE.[Measures].C 
AS 
[Measures].A/[Measures].B, 
FORMAT_STRING = "Percent", 
NON_EMPTY_BEHAVIOR = { [Utilisation Mins] }, 
VISIBLE = 1 , ASSOCIATED_MEASURE_GROUP = 'Bedstay' ; 
+0

Результаты снова смотрели прямо на кровать/январь 2011 года, но общая сумма для всех кроватей проходила через крышу, на этот раз на 1394,35% с этим изменением. Кажется, это не работает. Я не могу полностью обосновать математику для себя. – Pho

+0

Можете ли вы попытаться избавиться от 'Non_Empty_Behavior' и проверить? – SouravA

+0

См. Также мое редактирование. – SouravA

0

не является ответ, но, возможно, способ заглянуть в то, что происходит.

Пожалуйста, попробуйте добавить следующую меру:

CREATE MEMBER CURRENTCUBE.[Measures].UtilisationCount 
AS Count( 
    crossjoin(
     descendants([bedlabel].[hierarchy].currentmember, [Bedlabel].[Bedlabel]) 
    ,descendants([Date].[date].currentmember, [Date].[Day]) 
    ) 

Затем в запросе добавить эту новую меру, на колоннах, будем надеяться х, у, г, J, Q будет несколько цифр - что д ?:

January 2011 UtilisationCount Utilisation % 

Bed1   x     98.86% 
Bed2   y     88.38% 
Bed3   z     82.63% 
Bed4   j     94.67% 
Total   q     894.35% 
+0

Добавил меру. q = 31, так как Ян имеет 31 день. q не получило того, чего я ожидал. Я все еще озадачен. Как-то MDX чувствовал себя легче в AS2000: я не помню, как сейчас борется с этим использованием. – Pho

+0

@Pho mdx более эффективен в последней реализации. Синтаксис не сильно изменился. – whytheq

Смежные вопросы