Ssas 用另一列替换列中某个百分比的值

Ssas 用另一列替换列中某个百分比的值,ssas,powerbi,dax,powerquery,Ssas,Powerbi,Dax,Powerquery,我有个棘手的问题,也许你们中的一个能帮上忙 我有一个列,其中有几个不同的值,其中一个是“不可用”。我想创建一个计算列,将这些“不可用”值替换为4个新值,例如“值1”、“值2”等。。平均分配,即25%将为“价值1”,25%将为“价值2”,等等。我非常感谢能得到的任何帮助。我应该提到,我的数据存在于SSAS TDM中,因此我不能使用查询编辑器 谢谢 下面您将找到一些测试数据以及我想要的结果 Example = DATATABLE ( "Value", STRING, {

我有个棘手的问题,也许你们中的一个能帮上忙

我有一个列,其中有几个不同的值,其中一个是“不可用”。我想创建一个计算列,将这些“不可用”值替换为4个新值,例如“值1”、“值2”等。。平均分配,即25%将为“价值1”,25%将为“价值2”,等等。我非常感谢能得到的任何帮助。我应该提到,我的数据存在于SSAS TDM中,因此我不能使用查询编辑器

谢谢

下面您将找到一些测试数据以及我想要的结果

Example = 
DATATABLE (
    "Value", STRING,
    {
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Not Available" },
        { "Bike" },
        { "Bike" },
        { "Bike" },
        { "Bike" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Skateboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Snowboard" },
        { "Penny Board" },
        { "Penny Board" },
        { "Penny Board" },
        { "BMX" },
        { "BMX" },
        { "BMX" }
    }
)
预期结果:


我更喜欢在查询编辑器中执行此操作,因为在那里创建索引列更容易

确保两个表都已加载到查询编辑器中,即替换表,
Replace

let
    Source = Table.FromRows({{"Value1"},{"Value2"},{"Value3"},{"Value4"}},{"Value"}),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"Value", type text}}),
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1)
in
    #"Added Index"
还有您的示例表

  • 将索引添加到示例表中
  • 通过按
    Replace
    (本例中为4)的行计数取模来转换索引列
  • Replace
    合并到索引上匹配的
    Example
  • Value
    列展开为
    Value.1
  • 添加自定义列以选择要使用的列
  • 清理一下。删除所有不想保留的列
  • 以下是查询的M代码:

    let
        Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45W8ssvUXAsS8zMSUzKSVWK1RkuIk6Z2QQZwdmJJalJ+YlFKVTn5uWXU5sXkJqXV6ngRDTfyTcCk44FAA==", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type text) meta [Serialized.Text = true]) in type table [Value = _t]),
        #"Changed Type" = Table.TransformColumnTypes(Source,{{"Value", type text}}),
        #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 0, 1),
        #"Calculated Modulo" = Table.TransformColumns(#"Added Index", {{"Index", each Number.Mod(_, Table.RowCount(Replace)), type number}}),
        #"Merged Queries" = Table.NestedJoin(#"Calculated Modulo",{"Index"},Replace,{"Index"},"Replace",JoinKind.LeftOuter),
        #"Expanded Replace" = Table.ExpandTableColumn(#"Merged Queries", "Replace", {"Value"}, {"Value.1"}),
        #"Added Custom" = Table.AddColumn(#"Expanded Replace", "Value2", each if [Value] = "Not Available" then [Value.1] else [Value], type text),
        #"Removed Columns" = Table.RemoveColumns(#"Added Custom",{"Index", "Value.1"})
    in
        #"Removed Columns"
    

    在另一个答案中,我将假设您有一个索引替换表。我还假设您可以为
    示例
    表创建一个唯一的索引(这是一个单独的问题)

    逻辑相同,但现在作为DAX计算列:

    Value2 =
    IF (
        Example[Value] = "Not Available",
        LOOKUPVALUE (
            'Replace'[Value],
            'Replace'[Index], MOD ( Example[Index], COUNTROWS ( 'Replace' ) )
        ),
        Example[Value]
    )
    

    你能给出一个示例表和期望的结果吗?@AlexisOlson请查看我的编辑,谢谢。很抱歉,我应该指定我使用的是SSAS TDM,所以我认为我不能使用它。如果你有直接查询,我认为您根本无法添加列。我将在ssas中作为计算列进行这些更改,并引用新字段。谢谢!我要试一试!哇,多么优雅的解决方案啊。给你一个提示,伙计,这很有启发性。我真的很感谢你的帮助。