Skip to main content
cancel
Showing results for 
Search instead for 
Did you mean: 

Microsoft is giving away 50,000 FREE Microsoft Certification exam vouchers. Get Fabric certified for FREE! Learn more

v-eqin-msft

如何从另一个表中找到值

在本文中,我们将讨论如何从另一张表中查找值。我们将向你展示一些示例,以帮助你更好地理解。

 

样本数据:

 

任务表:

veqinmsft_0-1725001456096.png

 

过程表:

veqinmsft_1-1725001473500.png

 

员工表:

veqinmsft_1-1725002183077.png

 

关系:

veqinmsft_3-1725001507715.png

 

场景1: 

假设我想计算员工完成每项任务后剩余的任务数。 

 

使用DAX:

  1. 由于每项任务都只有一个需求列,我们可以使用 LOOKUPVALUE() 将其从任务表 添加到过程表。 
  2. 获取每个任务的 “已完成 ”值的累计总和。
  3. 最后,用 要求值减 "已完成" 的总和即可。 

 

 

剩余 =  
VAR _required = 
    LOOKUPVALUE ( '任务'[要求], [任务], '过程'[任务] ) 
VAR _hasDone = 
    CALCULATE ( 
        SUM ( '过程'[已完成] ), 
        FILTER ( 
            '过程', 
            [任务] = EARLIER ( '过程'[任务] ) 
                && [已完成] <= EARLIER ( '过程'[已完成] ) 
        ) 
    ) 
RETURN 
    _required – _hasDone 

 

 

 

结果:

veqinmsft_0-1725002164324.png

 

场景2: 

假设我想获得任务表 中每项任务最后剩余多少量。

 

方法1 ——使用DAX:

由于过程表 中的每个任务都有多个完成日期和值,我们不能再使用 LOOKUPVALUE()。在这种情况下,我们需要获取每个任务的 “已完成”值的累计和,然后用 需求列减去它。 

 

 

剩余 =   
var _hasDone=CALCULATE(SUM('过程'[已完成]),FILTER('过程',[任务]=EARLIER('任务'[任务])))  
return [要求] - _hasDone  

 

 

 

结果:

veqinmsft_0-1725002310208.png

 

方法2 ——在Power Query中使用 M 语言:

  1. 合并任务表和过程表。 
  2. 单击展开图标 -- 选择汇总 -- 只选择 已完成的总和 
  3. 添加自定义列来计算剩余的量 

 

完整的M语法:

 

 

let  
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WMlTSUXIEYiMDIyN9I30Q19DMQClWJ1rJCMh2QkiZgaRMTcBSxkC2M0LKAsQ0tlCKjQUA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [索引 = _t, 任务 = _t, 开始日期 = _t, 要求 = _t]),  
#"Changed Type" = Table.TransformColumnTypes(Source,{{"索引", Int64.Type}, {"任务", type text}, {"开始日期", type date}, {"要求", Int64.Type}}),  
#"Merged Queries" = Table.NestedJoin(#"Changed Type", {"任务"}, 过程, {"任务"}, "过程", JoinKind.LeftOuter),  
#"Aggregated Process" = Table.AggregateTableColumn(#"Merged Queries", "过程", {{"已完成", List.Sum, "Sum of 过程.已完成"}}),  
#"Added Custom" = Table.AddColumn(#"Aggregated Process", "遗留", each [要求]-[Sum of 过程.已完成]),  
#"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Sum of 过程.已完成"})  
in  
#"Removed Columns" 

 

 

 

结果:

veqinmsft_0-1725002513506.png

 

场景3: 

假设我想知道每位员工都处理过哪些不同的任务。 

 

方法1——使用DAX:

由于每位员工可能会处理多项任务,所以我们应该使用 CONCATENATEX() 来合并。

 

 

处理了哪些任务 =  
VAR _t = 
    SUMMARIZE ( 
        FILTER ( '过程', [员工] = EARLIER ( '员工'[员工] ) ), 
        [任务] 
    ) 
RETURN 
    CONCATENATEX ( _t, [任务], "," ) 

 

 

 

结果:

veqinmsft_1-1725002622756.png

 

方法2——在Power Query中使用M语言:

  1. 合并员工表和过程表。 
  2. 单击展开图标--选择展开--只选择任务列 
  3. 删除重复行 
  4. 合并每个员工的所有任务 

veqinmsft_0-1725002869256.png

veqinmsft_1-1725002877854.png

veqinmsft_2-1725002885737.png

 

完整的M语法:

 

 

let 
Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcszJLE5UitWJVnJKzQPTrpWpOZVAZiwA", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [员工 = _t]), 
#"Changed Type" = Table.TransformColumnTypes(Source,{{"员工", type text}}), 
#"Merged Queries" =Table.NestedJoin(#"Changed Type", {"员工"}, Process, {"Employee"}, "过程", JoinKind.LeftOuter), 
#"Expanded Process" = Table.ExpandTableColumn(#"Merged Queries", "过程", {"任务"}, {"任务"}), 
#"Removed Duplicates" = Table.Distinct(#"Expanded Process"), 
#"Grouped Rows" = Table.Group(#"Removed Duplicates", {"员工"}, {{"联合", each Text.Combine([任务],","), type text}}) 
in 
#"Grouped Rows" 

 

 

 

结果:

veqinmsft_2-1725002804433.png

 

希望这篇文章能帮助大家解决类似的问题。 

 

作者: Eyelyn Qin 

审稿人: Kerry Wang & Ula Huang