我有这张桌子:
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
正如我们在这里看到的,每个家庭都有一个成员,每个类别的成本是针对家庭计算的,而不是针对此人的。而且我们看到并非每个家庭都与其他家庭相同,但它有重量,因此每一个家庭都应该乘以家庭重量。 现在我的目标是为每个家庭编写一个度过的度量
我写了一个等式,但我看到它非常复杂,我猜它给出了错误的值。我写的Dax方程是
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
答案 0 :(得分:0)
首先,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]的相同值,因此我们需要做的就是除了[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]在上下文中,该度量将返回该族的值,并且在族级别将返回该族的值。我们可以改变度量,只在必要时给出[Family_ID]的整个[Person_ID]部分。