当 SUMX 应该将第一个参数作为表时,那么为什么我们使用 DISTINCT 它将返回一列不同的产品类别,以及为什么我们使用 CALCULATE 和 Sum 作为第二个参数。
TotalSalesByUniqueCategory = SUMX(
DISTINCT(DimProduct[Category]),
CALCULATE(SUM(FactSales[Profit]) )
)
DISTINCT(DimProduct[Category])
:
SUMX
函数的第一个参数,它返回一个表,其中包含列 DimProduct[Category]
的不同值。SUMX
的有效输入。示例: 如果您的
DimProduct[Category]
包含:
Category
---------
A
B
A
C
B
然后
DISTINCT(DimProduct[Category])
会返回:
Category
---------
A
B
C
SUMX()
:
SUMX
是一个迭代器函数。它迭代作为第一个参数提供的表的每一行 (DISTINCT(DimProduct[Category])
)。CALCULATE(SUM(FactSales[Profit]))
:
SUMX
的第二个参数是CALCULATE(SUM(FactSales[Profit]))
。CALCULATE
修改评估 SUM(FactSales[Profit])
的上下文。
CALCULATE
更改过滤器上下文以仅考虑迭代中的当前类别。SUM(FactSales[Profit])
然后在迭代中计算仅针对当前类别的总利润。总结:
SUMX
迭代每个独特的产品类别(A
、B
、C
)。CALCULATE(SUM(FactSales[Profit]))
,从而总结该特定类别的 FactSales[Profit]
。SUMX
将所有这些单独的总和相加,得出所有不同类别的总利润。让我们考虑一个小数据集:
暗淡产品表:
| Category |
|----------|
| A |
| B |
| A |
| C |
| B |
事实销售表: |产品 |类别 |利润| |---------|----------|--------| | P1 |一个 | 100 | 100 | P2 |乙| 200 | 200 | P3 |一个 | 150 | 150 | P4 | P4 | C | 300 | 300 | P5|乙| 250 |
逐步执行:
DISTINCT(DimProduct[Category])
返回:A
、B
、C
。A
: CALCULATE(SUM(FactSales[Profit]))
返回 100 + 150 = 250
。B
: CALCULATE(SUM(FactSales[Profit]))
返回 200 + 250 = 450
。C
: CALCULATE(SUM(FactSales[Profit]))
返回 300
。SUMX
然后对这些值求和:250 + 450 + 300 = 1000
。CALCULATE
?CALCULATE
在这里是必要的,因为它修改迭代中每个类别的过滤器上下文。如果没有 CALCULATE
,SUM(FactSales[Profit])
将考虑整个数据集,而不是按当前类别进行过滤。SUMX
而不是SUM
?SUM
直接对列进行操作并对它的值求和。在这种情况下,我们想要“迭代不同类别的列表”,并为每个类别计算总利润。这就是使用迭代器函数 SUMX
的原因。
迭代每个不同的类别(
A
B
、C
)。使用 CALCULATE