这个DAX查询是如何工作的,我想了解这个查询的流程

问题描述 投票:0回答:1

当 SUMX 应该将第一个参数作为表时,那么为什么我们使用 DISTINCT 它将返回一列不同的产品类别,以及为什么我们使用 CALCULATE 和 Sum 作为第二个参数。

TotalSalesByUniqueCategory = SUMX(
DISTINCT(DimProduct[Category]),
CALCULATE(SUM(FactSales[Profit]) )
)
dax data-analysis powerbi-desktop
1个回答
0
投票
  1. DISTINCT(DimProduct[Category])

    • 这是
      SUMX
      函数的第一个参数,它返回一个表,其中包含列
      DimProduct[Category]
      的不同值。
    • 尽管它看起来像是返回一列,但在 DAX 中,一列被视为单列表,因此它是
      SUMX
      的有效输入。

    示例: 如果您的

    DimProduct[Category]
    包含:

    Category
    ---------
    A
    B
    A
    C
    B
    

    然后

    DISTINCT(DimProduct[Category])
    会返回:

    Category
    ---------
    A
    B
    C
    
  2. SUMX()

    • SUMX
      是一个迭代器函数。它迭代作为第一个参数提供的表的每一行 (
      DISTINCT(DimProduct[Category])
      )。
    • 对于这个不同类别列表中的每一行,它都会评估作为第二个参数提供的表达式。
  3. CALCULATE(SUM(FactSales[Profit]))

    • SUMX
      的第二个参数是
      CALCULATE(SUM(FactSales[Profit]))
    • CALCULATE
      修改评估 SUM(FactSales[Profit])
       的上下文
    • 迭代每个类别(来自不同列表)时,
      CALCULATE
      更改过滤器上下文以仅考虑迭代中的当前类别。
    • SUM(FactSales[Profit])
      然后在迭代中计算仅针对当前类别的总利润。
  4. 总结

    • 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 |

逐步执行

  1. DISTINCT(DimProduct[Category])
    返回:
    A
    B
    C
  2. 对于每个类别:
    • 对于
      A
      CALCULATE(SUM(FactSales[Profit]))
      返回
      100 + 150 = 250
    • 对于
      B
      CALCULATE(SUM(FactSales[Profit]))
      返回
      200 + 250 = 450
    • 对于
      C
      CALCULATE(SUM(FactSales[Profit]))
      返回
      300
  3. SUMX
    然后对这些值求和:
    250 + 450 + 300 = 1000

为什么使用
CALCULATE

  • CALCULATE
    在这里是必要的,因为它修改迭代中每个类别的过滤器上下文。如果没有
    CALCULATE
    SUM(FactSales[Profit])
    将考虑整个数据集,而不是按当前类别进行过滤。

为什么使用
SUMX
而不是
SUM

  • SUM
    直接对列进行操作并对它的值求和。在这种情况下,我们想要“迭代不同类别的列表”,并为每个类别计算总利润。这就是使用迭代器函数 SUMX 的原因。
    
    
  • 总结

公式:

迭代每个不同的类别(
    A
  • B
    C
    )。
    使用 
  • CALCULATE
  • 按当前类别过滤销售数据。
    将每个类别的利润相加并汇总这些总数。
© www.soinside.com 2019 - 2024. All rights reserved.