如何在Power BI中按国家(配送/账单国)计算Measure并正确汇总
现有Orders表
| Order ID | 销售数量 | Price paid (USD) | 配送国家 | 账单国家 |
|---|---|---|---|---|
| 1000000 | 2 | 120 | United States | |
| 1000001 | 1 | 10500 | Canada | United States |
| 1000002 | 4 | 400 | France | Canada |
| 1000003 | 12 | 6250 | United States | Canada |
| 1000004 | 5 | 2150 | France | France |
已创建的DAX度量值
Value = SUM('Orders'[Price paid (USD)]) Volume = SUM('Orders'[销售数量]) Average Unit Price = SUMX( 'Orders', DIVIDE('Orders'[Price paid (USD)], 'Orders'[销售数量]) )
需求说明
目前可以将Orders[配送国家]或Orders[账单国家]放入Power BI矩阵的行区域,在对应筛选上下文下计算度量值。但需要实现按国家名称(无论来自配送国家还是账单国家列)汇总度量值,最终得到如下目标表:
目标汇总表
| 国家名称 | Value | Volume |
|---|---|---|
| Canada | 17150 | 17 |
| France | 2550 | 9 |
| United States | 16870 | 15 |
汇总规则
- 包含两个不同国家的订单,需分别计入对应国家的行中;
- 仅含一个国家(账单国家为空)或两国相同的订单,仅计入一次。
实现方案
第一步:创建独立的国家维度表
先生成一个包含所有唯一国家名称的维度表,用以下DAX表达式即可:
国家维度表 = DISTINCT( UNION( VALUES('Orders'[配送国家]), VALUES('Orders'[账单国家]) ) )
如果账单国家存在空值,生成后可手动删除空行,也可以在表达式中直接过滤:FILTER(UNION(...), NOT ISBLANK([配送国家]))
第二步:改写度量值
原度量值仅支持单维度筛选,需要调整为适配配送/账单双国家匹配的逻辑:
汇总Value的度量
Value_按国家汇总 = SUMX( 'Orders', VAR 当前配送国家 = 'Orders'[配送国家] VAR 当前账单国家 = 'Orders'[账单国家] VAR 当前筛选国家 = SELECTEDVALUE('国家维度表'[国家名称]) RETURN // 账单为空的订单,仅当配送国家匹配时计入 IF(ISBLANK(当前账单国家), IF(当前配送国家 = 当前筛选国家, 'Orders'[Price paid (USD)], 0), // 配送与账单国家相同的订单,匹配时仅计一次 IF(当前配送国家 = 当前账单国家, IF(当前配送国家 = 当前筛选国家, 'Orders'[Price paid (USD)], 0), // 两国不同的订单,只要其中一个匹配就全额计入 IF(当前配送国家 = 当前筛选国家 || 当前账单国家 = 当前筛选国家, 'Orders'[Price paid (USD)], 0 ) ) )
汇总Volume的度量
Volume_按国家汇总 = SUMX( 'Orders', VAR 当前配送国家 = 'Orders'[配送国家] VAR 当前账单国家 = 'Orders'[账单国家] VAR 当前筛选国家 = SELECTEDVALUE('国家维度表'[国家名称]) RETURN IF(ISBLANK(当前账单国家), IF(当前配送国家 = 当前筛选国家, 'Orders'[销售数量], 0), IF(当前配送国家 = 当前账单国家, IF(当前配送国家 = 当前筛选国家, 'Orders'[销售数量], 0), IF(当前配送国家 = 当前筛选国家 || 当前账单国家 = 当前筛选国家, 'Orders'[销售数量], 0 ) ) )
第三步:构建矩阵可视化
将国家维度表[国家名称]拖入矩阵的行区域,再添加改写后的Value_按国家汇总和Volume_按国家汇总度量值,即可得到目标汇总结果。
内容的提问来源于stack exchange,提问作者s7eqx9f74nc4
相关产品推荐
相关产品推荐

