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-rzhou-msft

如何在Power Query 中分组装箱

场景: 

本博客将重点介绍如何在 Power BI 中使用 Power Query 计算分组。我们将提供一个包含产品和值两个字段的数据源,目标是设计一个直方图,以更好地传达关于产品基础的见解。 

 

 最初导入的表格模型如下所示: 

vrzhoumsft_0-1732586700254.png

详细步骤: 

  1. 将数据导入 Power BI 查询编辑器,并确保列的数据类型符合要求。 
  2. 现在,我们需要将“值”列分组,再按照组分类来创建直方图。

但是,表中没有分组列,因此您需要创建一个值分组列。我们可以添加排序步骤,以避免分组后行排序改变。 

 

解决方案 1: 

为了得到值分组:首先,找出值分组的最小值(例如 22 → 20、34 → 30),并删除个位数。您可以将值除以 10,然后使用 Number.IntegerDivide 对其向下取整。结果乘以 10。找到最小值后,再加 9 获得最大值。使用 Text.Format 合并值分组的最小值和最大值,以避免因数据类型的不同而引起的错误。 

 

let 

  源 = Table.FromRows( 

    Json.Document( 

      Binary.Decompress( 

        Binary.FromText( 

          "Lc7LDYAwDAPQXXLuAVqKuPIrfxaIuv8axA63J8eJoiqjBIlRalCZwETOxp5aEA7kCjZkATO5GZMXdmz5rQOpF05j5+mFNeo2ZeeDeUu+/zP1Aw==", 

          BinaryEncoding.Base64 

        ), 

        Compression.Deflate 

      ) 

    ), 

    let 

      _t = ((type nullable text) meta [Serialized.Text = true]) 

    in 

      type table [产品 = _t, 值 = _t] 

  ), 

  #"更改数据类型" = Table.TransformColumnTypes(源, {{"值", Int64.Type}}), 

  #"分组" = Table.AddColumn( 

    #"更改数据类型", 

    "分组", 

    each Text.Format( 

      "#[left]-#[right]", 

      [left = Number.IntegerDivide([值] / 10, 1) * 10, right = left + 9] 

    ) 

  ), 

  #"排序" = Table.Sort(分组, {"分组", 0}) 

in 

  #"排序" 

 

vrzhoumsft_1-1732587025185.png

结果: 

vrzhoumsft_2-1732587032292.png

 

解决方案 2: 

例如,如果 10-20 值分组中没有产品,按照解决方案 1 中的分组方法则不会显示 10-20组的数据。我们可以使用另一种方法: 

  1. 首先,建立每个值组。 
  2. 筛选出每个组范围内的值。 
  3. 统计过滤后表格中的行数。 

 

let 

  源 = Table.FromRows( 

    Json.Document( 

      Binary.Decompress( 

        Binary.FromText( 

          "Lc7LDYAwDAPQXXLuAVqKuPIrfxaIuv8axA63J8eJoiqjBIlRalCZwETOxp5aEA7kCjZkATO5GZMXdmz5rQOpF05j5+mFNeo2ZeeDeUu+/zP1Aw==", 

          BinaryEncoding.Base64 

        ), 

        Compression.Deflate 

      ) 

    ), 

    let 

      _t = ((type nullable text) meta [Serialized.Text = true]) 

    in 

      type table [产品 = _t, 值 = _t] 

  ), 

  #"更改数据类型 1" = Table.TransformColumnTypes(源, {{"产品", type text}, {"值", Int64.Type}}), 

  #"分组" = Table.FromColumns( 

    {List.Transform(List.Numbers(0, 7, 10), each Text.Format("#{0}-#{1}", {_, _ + 9}))}, 

    {"分组"} 

  ), 

  #"计数" = Table.AddColumn( 

    分组, 

    "行数", 

    each Table.RowCount( 

      Table.SelectRows( 

        #"更改数据类型 1", 

        (x) => 

          x[值] 

            >= Number.From(Text.Split([分组], "-"){0}) 

            and x[值] < Number.From(Text.Split([分组], "-"){1}) 

      ) 

    ) 

  ), 

  #"更改数据类型 2" = Table.TransformColumnTypes(计数, {{"行数", Int64.Type}}) 

in 

  #"更改数据类型 2" 

 

vrzhoumsft_3-1732587190658.png

结果: 

vrzhoumsft_4-1732587198630.png

 

解决方案 3: 

Power BI Desktop 还内置了创建新建组的功能,但坐标轴的形式是固定的。如果要自定义坐标轴,可以参考第一种和第二种解决方案。 

vrzhoumsft_0-1732587289690.png

调整装箱大小: 

vrzhoumsft_1-1732587302336.png

结果: 

vrzhoumsft_2-1732587302338.png

 

总结: 

 您可以根据需求选择使用不同的方法。在许多情况下,第二种方法更适用。 

 

原作者:Liang 

审核:Ula Huang & Kerry Wang

翻译:Yaning Yang