2014-08-17 4 views
0

Скажем, у меня есть две таблицы. attrsTable:Подведение значений связанной таблицы в PowerPivot/DAX

file | attribute | value 
------------------------ 
A | xdim  | 5 
A | ydim  | 6 
B | xdim  | 7 
B | ydim  | 3 
B | zdim  | 2 
C | xdim  | 1 
C | ydim  | 7 

sizeTable:

file | size 
----------- 
A | 17 
B | 23 
C | 34 

У меня есть эти таблицы, связанные через поле 'файл'. Я хочу измерение PowerPivot в attrsTable, чей расчет использует размер. Например, скажем, я хочу xdim + ydim/размер для каждого из A, B, C. Расчеты будут:

A: (5+6)/17 
B: (7+3)/23 
C: (1+7)/34 

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

Я пробовал:

dimPerSize := CALCULATE([value]/SUM(sizeTable[size])) # Calculates 0 
dimPerSize := CALCULATE([value]/SUM(RELATED(sizeTable[size]))) # Produces an error 

Любая идея, что я делаю не так? Вероятно, мне не хватает фундаментальных концепций использования DAX с отношениями.

ответ

1

Привет Redstreet,

сделать шаг назад от вашего решения и предложенного Иаковом, я думаю, что это может быть полезно, чтобы создать еще одну таблицу, которая будет агрегировать все расчеты (особенно учитывая, вы, вероятно, более чем 2 таблицы с атрибутами, специфичными для файла).

Так что я создал еще одну таблицу, которая содержит (только) уникальные имена файлов, и, таким образом, отношения могут визуализироваться так:

enter image description here

Это гораздо проще, чтобы добавить необходимые меры (нет необходимости в расчетные столбцы). Я тестировал 2 сценария:

1) создают простые меры SUM для обоих атрибутов Размер Значение и Файл. Затем разделите эти две меры и выполните задание :-).

2) использовать функции SUMX, чтобы иметь более универсальное решение. Тогда окончательная формула для расчета DimPerSize может выглядеть следующим образом:

=DIVIDE(
    SUMX(DISTINCT(fileTable[file]),[Sum of AttrValue]), 
    SUMX(DISTINCT(fileTable[file]),[Sum of FileSize]), 
    BLANK() 
) 

С [Сумма значение атрибута] бытия:

=SUM(attrsTable[value]) 

И Сумма FileSize являются:

=SUM(sizeTable[size]) 

Этот работал отлично, хотя SUMX в обоих случаях просматривает все экземпляры заданного имени файла. Таким образом, для файла B он также вычисляет zdim (если необходимо отфильтровать его, используйте простую комбинацию вычислений/фильтров). В случае размера файла я также использую SUMX, даже если он не нужен, так как таблица содержит только 1 запись для каждого имени файла. Если бы было 2 экземпляра, используйте SUMX или AVERAGEX в зависимости от желаемого результата.

This is the link to my source file in Excel (2010).

Надеется, что это помогает.

0

Вы считаете, что концепция отношений ОК, но вы не находитесь на правильном пути с точки зрения CALCULATE() либо с точки зрения структуры, либо из-за того, что вы не можете просто использовать «голые» числовые столбцы, они должны быть каким-то образом упакованы.

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

Лучшая практика, вероятно, чтобы построить это с использованием нескольких мер:

[xdim] = CALCULATE(SUM('attrstable'[value]), 'attrstable'[attribute] = "xdim") 
[ydim] = CALCULATE(SUM('attrstable'[value]), 'attrstable'[attribute] = "ydim") 
[dimPerSize] = ([xdim] + [ydim])/VALUES('sizeTable'[size]) 

Но в зависимости от того, как именно стержень установлен, это, вероятно, также выдаст ошибку, потому что он будет пытаться использовать весь столбец «размер» в ваших итогах. Есть две основные стратегии для борьбы с этим:

  1. Используйте «итерационный» формулу, такие как SUX() или AVERAGEX() для итерации по отдельности над полем «файл», а затем складывает или средние на общую сумму например

    [ItdimPerSize] = AVERAGEX (VALUES ('sizeTable' [файл]), [dimPerSize])

    В зависимости от математики, которые вы хотите использовать, вы можете обнаружить, что производить полезную среднем, что вам нужно использовать SUMX, но делить на количество случаев, то есть COUNTROWS ('sizeTable' [файл]).

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

    [NtdimPerSize] = IF (HASONEVALUE ('sizeTable' [файл]), [dimPerSize], BLANK())

NB, все это предполагает, что, когда вы создаете свой стержень, который вас «перетаскивают» поле файла из «sizetable».

+0

спасибо за ответ, но, похоже, есть несколько проблем с тем, что вы наметили. a) Синтаксис: Предполагаю, вы имеете в виду ydim: = ..., а не [ydim] = ... b) ваш [dimPerSize] делится на VALUES(). VALUES() возвращает таблицу, и, таким образом, я получаю сообщение об ошибке; c) Я не могу фильтровать «xdim», «ydim» и т. д., потому что их слишком много, а также я хочу их отрезать позже d) из-за (b), ваши формулы в 1. и 2. Не работайте. Любые указатели? – PonyEars

+0

Не поймите, что вы пытаетесь сделать с a) - нет универсального соглашения о том, как изобразить, что что-то является мерой Dax, и это, безусловно, не является синтаксической ошибкой. Текст в [] - это имя меры, а все справа - тело меры. В терминах b) и, следовательно, d) я просто предлагаю вам прочитать весь ответ, половина из которых касается способов использования VALUES(), но имеет дело с тем, что формула ожидает единственное значение. Возможно, вам потребуется предоставить более полное объяснение желаемых результатов. – Jacob

+0

С a), похоже, что x: = ... - это точный синтаксис, который вводится в вычисляемое поле (aka measure). Я предполагаю, что ваше использование [x] = ... вместо этого, и тот факт, что ваш DAX возвращает таблицу, смутил меня.С b) и d) я прочитал, но я все еще не уверен, что понимаю ваш подход: вы, кажется, предлагаете использовать две меры (например, dimPerSize и ItdimPerSize), где вторая зависит от первой. первая не является допустимой мерой, и я не могу заставить ее работать даже с использованием функции агрегации. – PonyEars

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