如何在Power BI中按条件分组汇总表格,实现单Name行输出
解决Power BI中按Name分组取最优Segment组合的问题
下面提供两种实现方案,分别基于Power Query(数据预处理)和DAX(计算表),完全匹配你的需求:
方案一:Power Query 实现(推荐用于数据清洗阶段)
步骤如下:
- 将原始数据导入Power BI,进入Power Query编辑器
- 选中原始表,点击「转换」选项卡 → 「分组依据」,设置:
- 分组列:依次添加
Name、Segment1、Segment2 - 新列名:
Count,操作选择「行计数」
得到每个Name-Segment组合的AccountID计数表
- 分组列:依次添加
- 添加自定义列,计算每个Name对应的最大计数:
= List.Max(Table.SelectRows(#"分组的行", (x) => x[Name] = [Name])[Count]) - 筛选行:保留
Count等于自定义列值的行(此时已筛选出每个Name的最高计数组合) - 添加优先级列,处理平局时优先选择非空Segment:
= if [Segment1] <> null and [Segment1] <> "" and [Segment2] <> null and [Segment2] <> "" then 1 else if [Segment1] <> null and [Segment1] <> "" then 2 else 3 - 按
Name升序、优先级升序排序,确保非空组合排在前面 - 再次分组:按
Name分组,操作选择「所有行」,新列名设为Grouped Rows - 添加自定义列提取每组第一行:
= Table.First([Grouped Rows]) - 展开自定义列,选择需要的字段(Name、Count、Segment1、Segment2),调整列顺序后加载到Power BI
方案二:DAX 计算表实现(适合报表内动态计算)
创建三个DAX计算表,最终得到结果:
1. 计算每个Name-Segment组合的计数
CombinationCounts = SUMMARIZE( '原始表', '原始表'[Name], '原始表'[Segment1], '原始表'[Segment2], "Count", COUNTROWS('原始表') )
2. 计算每个Name的最大计数
NameMaxCounts = SUMMARIZE( CombinationCounts, CombinationCounts[Name], "MaxCount", MAX(CombinationCounts[Count]) )
3. 筛选最优组合并处理平局
FinalResult = VAR CombinedTable = NATURALLEFTOUTERJOIN(CombinationCounts, NameMaxCounts) VAR FilteredMax = FILTER(CombinedTable, [Count] = [MaxCount]) VAR AddPriority = ADDCOLUMNS( FilteredMax, "Priority", SWITCH( TRUE(), NOT(ISBLANK([Segment1])) && NOT(ISBLANK([Segment2])), 1, NOT(ISBLANK([Segment1])), 2, 3 ) ) VAR RankedGroups = ADDCOLUMNS( AddPriority, "GroupRank", RANKX(FILTER(AddPriority, [Name] = EARLIER([Name])), [Priority], , ASC, DENSE) ) RETURN SELECTCOLUMNS( FILTER(RankedGroups, [GroupRank] = 1), "Name", [Name], "Max of Count of Account ID", [MaxCount], "Segment1", [Segment1], "Segment2", [Segment2] )
内容的提问来源于stack exchange,提问作者Here 2 Learn VBA
相关产品推荐
相关产品推荐

