DAX实现设备匹配后SKU列批量乘数量并保留结构的方法
DAX实现设备SKU数量批量乘法(适配新增设备与SKU列)
需求说明
作为DAX新手,现有两张表:
- 设备汇总表:存储设备名称及对应总数量
- SKU表:记录各设备对应的组件SKU数量,包含多列SKU字段
需要生成一张计算表,满足:
- 按设备名称匹配两张表的行数据
- 将SKU表中每一列的数值乘以对应设备的总数量
- 保留SKU表的列结构,且能自动适配新增的设备行或SKU列
已通过LOOKUPVALUE实现设备数量匹配,但无法批量处理所有SKU列的乘法;尝试过Product/ProductX函数,这类函数会汇总列数据,不符合需求。
示例数据
设备汇总表
| 设备名称 | 数量 |
|---|---|
| AA | 7 |
| BB | 4 |
| CC | 20 |
SKU表
| 设备名称 | SKU#1 | SKU#2 | SKU#3 |
|---|---|---|---|
| AA | 2 | 2 | 8 |
| BB | 1 | 0 | 4 |
| CC | 0 | 1 | 0 |
期望结果表
| 设备名称 | SKU#1 | SKU#2 | SKU#3 |
|---|---|---|---|
| AA | 14 | 14 | 56 |
| BB | 4 | 0 | 16 |
| CC | 0 | 20 | 0 |
已尝试代码
匹配设备数量 = LOOKUPVALUE('设备汇总表'[数量],'设备汇总表'[设备名称], 'SKU表'[设备名称])
解决方案
方案一:手动维护列(适合SKU列新增频率低)
代码简单易理解,若新增SKU列,只需在代码中添加对应列的计算逻辑:
计算结果表 = ADDCOLUMNS( 'SKU表', "匹配数量", LOOKUPVALUE('设备汇总表'[数量], '设备汇总表'[设备名称], 'SKU表'[设备名称]), "SKU#1", 'SKU表'[SKU#1] * [匹配数量], "SKU#2", 'SKU表'[SKU#2] * [匹配数量], "SKU#3", 'SKU表'[SKU#3] * [匹配数量] ) // 若新增SKU#4,添加一行:"SKU#4", 'SKU表'[SKU#4] * [匹配数量]
方案二:动态适配所有SKU列(适合SKU列频繁新增)
通过转窄表计算再转回宽表的方式,自动识别所有SKU列,新增列时仅需少量修改:
计算结果表 = // 步骤1:将SKU宽表转为窄表,提取所有SKU列数据 VAR 窄表SKU = UNION( SELECTCOLUMNS('SKU表', "设备名称", 'SKU表'[设备名称], "SKU列名", "SKU#1", "SKU数量", 'SKU表'[SKU#1]), SELECTCOLUMNS('SKU表', "设备名称", 'SKU表'[设备名称], "SKU列名", "SKU#2", "SKU数量", 'SKU表'[SKU#2]), SELECTCOLUMNS('SKU表', "设备名称", 'SKU表'[设备名称], "SKU列名", "SKU#3", "SKU数量", 'SKU表'[SKU#3]) // 新增SKU列时,复制上述格式添加一行即可 ) // 步骤2:关联设备数量并计算乘积 VAR 计算后SKU = ADDCOLUMNS( 窄表SKU, "计算后数量", [SKU数量] * LOOKUPVALUE('设备汇总表'[数量], '设备汇总表'[设备名称], [设备名称]) ) // 步骤3:将窄表转回宽表,恢复原列结构 RETURN SUMMARIZE( 计算后SKU, [设备名称], "SKU#1", CALCULATE(SUM([计算后数量]), [SKU列名] = "SKU#1"), "SKU#2", CALCULATE(SUM([计算后数量]), [SKU列名] = "SKU#2"), "SKU#3", CALCULATE(SUM([计算后数量]), [SKU列名] = "SKU#3") // 新增SKU列时,复制上述格式添加一行即可 )
进阶动态方案(无需手动添加新列)
若需完全自动适配新增SKU列(无需修改代码),可使用DAX动态表达式生成逻辑,需配合DAX Studio执行或通过计算组实现:
// 生成动态DAX代码 VAR SKU列名列表 = EXCEPT( SELECTCOLUMNS(ALLCOLUMNS('SKU表'), "@列名", [ColumnName]), {"设备名称"} ) VAR 动态SELECT语句 = CONCATENATEX( SKU列名列表, """" & [@列名] & """, 'SKU表'[" & [@列名] & "] * LOOKUPVALUE('设备汇总表'[数量], '设备汇总表'[设备名称], 'SKU表'[设备名称])", ", " ) VAR 最终DAX代码 = "SELECTCOLUMNS('SKU表', ""设备名称"", 'SKU表'[设备名称], " & 动态SELECT语句 & ")" RETURN EVALUATE(VALUE(最终DAX代码))
注:此方案需在DAX Studio中执行,或通过Power BI的计算组实现动态列展示。
内容的提问来源于stack exchange,提问作者Alistair Hogan
相关产品推荐
相关产品推荐

