Как суммировать отдельные значения, объединяющие другие значения

У меня есть эта таблица:

Family_ID Person_ID Weight Spent_amount category
A           1         10       500        flight
A           2         10       500        flight
A           1         10       200        Hotel
A           2         10       200        Hotel
B           3         20       250        flight
B           3         20       300        Hotel

как мы видим здесь, в каждой семье есть член, а расходы на категорию рассчитаны для семьи, а не для человека. И, как мы видим, не каждая семья равна другой, но имеет вес, поэтому каждую потраченную сумму следует умножить на вес семьи. Теперь моя цель - написать меру расходов на каждую семью

Я написал уравнение, но я вижу его очень сложным, и я думаю, что оно дает неправильное значение. Уравнение Дакса, которое я написал,

cash_wieght:=SUMX (
    SUMMARIZE (
s2g516_full,
s2g516_full[DIM_HOUSEHOLD_REF_ID],
"cash", CALCULATE ( MAXX ( SUMMARIZE (
s2g516_full,
  s2g516_full[Persons],
  s2g516_full[DIM_HOUSEHOLD_REF_ID] ,"cash1", CALCULATE ( Sum(s2g516_full[SPENT_PER_REASON])*MAX ( s2g516_full[Weight] ) )
/distinctcount(s2g516_full[person])  ),[Cash1] ) )
 ),
    [cash]
)

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

В результате я хочу это weight * spent_amount суммироваться и фильтроваться с помощью family_ID, как будто person_ID отсутствует в таблице, например: "если я отфильтровал по Family_ID"

A 700*10
B 550 *20

1 ответ

Решение

Во-первых, DAX Formatter - твой друг.

cash_wieght :=
SUMX (
    SUMMARIZE (
        s2g516_full,
        s2g516_full[DIM_HOUSEHOLD_REF_ID],
        "cash", CALCULATE (
            MAXX (
                SUMMARIZE (
                    s2g516_full,
                    s2g516_full[Persons],
                    s2g516_full[DIM_HOUSEHOLD_REF_ID],
                    "cash1", CALCULATE (
                        SUM ( s2g516_full[SPENT_PER_REASON] ) * MAX ( s2g516_full[Weight] )
                    )
                        / DISTINCTCOUNT ( s2g516_full[person] )
                ),
                [Cash1]
            )
        )
    ),
    [cash]
)

После этого, я думаю, у вас есть правильная интуиция с SUMMARIZE(), но это может быть намного проще, чем то, что вы делаете. SUMMARIZE() группирует по полям таблицы, которую вы ей передаете. Поскольку члены с одинаковым [Family_ID] имеют одинаковые значения для [Spent_Amount] в данном [Category], все, что нам нужно сделать, это сгруппировать все из таблицы, кроме [Person_ID].

cash_wieght:=
SUMX (
    SUMMARIZE(
        FactSpend
        ,FactSpend[Family_ID]
        ,FactSpend[Weight]
        ,FactSpend[Category]
        ,FactSpend[Spent_Amount]
    )
    ,FactSpend[Weight] * FactSpend[Spent_Amount]
)

Здесь мы используем SUMMARIZE () для группировки по [Family_ID], [Weight], [Category] и [Spent_Amount]. Поскольку сложение и умножение являются коммутативными, не имеет значения, добавляем ли мы сначала или сначала умножаем.

Поэтому мы используем SUMX() для итерации по каждой строке, возвращаемой нашим SUMMARIZE(), и накапливаем в сумму значения [Weight] * [Spent_Amount] для каждой строки в этой сгруппированной таблице.

Вот изображение моей выборки данных и сводной таблицы, основанной на соответствующем выполнении этой меры. Это также работает при добавлении любых атрибутов из таблицы в контекст фильтра. Если один [Person_ID] находится в контексте, мера вернет значение для семьи, а на уровне семьи вернет значение для семьи. Мы можем изменить меру, чтобы при необходимости дать только одну [Person_ID] часть целого [Family_ID].

Другие вопросы по тегам