Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String POWERBI、DAX:连接字符串、拆分和保留子字符串仅一次_String_Loops_Powerbi_Unique_Dax - Fatal编程技术网

String POWERBI、DAX:连接字符串、拆分和保留子字符串仅一次

String POWERBI、DAX:连接字符串、拆分和保留子字符串仅一次,string,loops,powerbi,unique,dax,String,Loops,Powerbi,Unique,Dax,我试着做到以下几点: 我有一个带字符串的列,每个列可以有几个由分隔符分隔的子字符串“:” 我需要连接列字符串(我在这里做一个过滤器,只保留相互测试行) 然后根据分隔符拆分“:” 如果子字符串重复,则只保留一次 例如: ColumnHeader AA:BB:CC BB:DD DD:AA:EE EE:AA:DD:BB BB:EE ... 预期结果将是唯一的字符串: "AA:BB:CC:DD:EE" 在DAX中如何填写新列 我希望在DAX中找到for/while循环,就像在

我试着做到以下几点:

  • 我有一个带字符串的列,每个列可以有几个由分隔符分隔的子字符串“:”
  • 我需要连接列字符串(我在这里做一个过滤器,只保留相互测试行)
  • 然后根据分隔符拆分“:”
  • 如果子字符串重复,则只保留一次
例如:

ColumnHeader
AA:BB:CC
BB:DD
DD:AA:EE
EE:AA:DD:BB
BB:EE
...
预期结果将是唯一的字符串:

"AA:BB:CC:DD:EE"
在DAX中如何填写新列

我希望在DAX中找到for/while循环,就像在Python中一样。。。但失败了

我试过这个:

List =
VAR SIn = ""
VAR SOut = ""
VAR Cursor = 0
VAR SList =
        CONCATENATEX(
            FILTER(ATable, ATable[Name] = CTable[Name]),
            [ColumnHeader],
            ":")
VAR pos1 = FIND(":", SList, Cursor, len(SList))
VAR pos2 = FIND(":", SList, pos1, len(SList))
VAR elem = TRIM(MID(SList, pos1+1, pos2-pos1))

// following is not good but is what I would like to do:
VAR SOut = CONCATENATE(SOut, elem)
VAR SList = MID(SList, pos2, len(SList)-pos2)
VAR Cursor = pos2

// I need to loop ... but how ? ... as no for/while loops are possibles ?
谢谢你的帮助

=====================================

由于下面的答案,我成功地解决了这个问题

为了更好地理解全球问题,我仍将提供更大的数据集:

我有两张桌子:

TABLE_BY_ELEMENT            
KEY GROUP   LIST        KEY_DATA
1   G1      AA:BB:FF    11
2   G1      CC:AA       22
3   G1      FF:DD:AA    33
4   G1      CC:DD:AA    44
5   G2      CC:FF:GG    55
6   G2      BB:AA       66
            
            
TABLE_BY_GROUP          
GROUP   GROUP_DATA      
G1      1111        
G2      2222        
我想查看如下数据:

RESULT_BY_GROUP     
GROUP   GROUP_DATA  NewList
G1      111         AA:BB:FF:CC:DD
G2      222         CC:FF:GG:BB:AA
List = CONCATENATEX( VALUES('Table'[ColumnHeader]), 'Table'[ColumnHeader], ":" )
而且:

RESULT_ELEMENT      
KEY LIST        KEY_DATA
1   AA:BB:FF    11
2   CC:AA       22
3   FF:DD:AA    33
4   CC:DD:AA    44
5   CC:FF:GG    55
6   BB:AA       66

我希望这更容易理解。

DAX不适合这样做。如果您需要使用DAX使其成为一个动态度量,那么您可能需要重塑数据以使其更可用。比如说,

ID   ColumnHeader
1    AA
1    BB
1    CC
2    BB
2    DD
3    DD
3    AA
3    EE
...
您可以在查询编辑器中使用“拆分列”>“按分隔符”工具进行拆分,并选择在冒号上拆分并展开为行

一旦它以这种更有用的格式出现,您就可以在DAX中使用它,如下所示:

RESULT_BY_GROUP     
GROUP   GROUP_DATA  NewList
G1      111         AA:BB:FF:CC:DD
G2      222         CC:FF:GG:BB:AA
List = CONCATENATEX( VALUES('Table'[ColumnHeader]), 'Table'[ColumnHeader], ":" )

借用DAX的逻辑,完全可以在DAX中实现这一点,但我不推荐这种方法

List =
VAR LongString =
    CONCATENATEX ( VALUES ( 'Table1'[ColumnHeader] ), Table1[ColumnHeader], ":" )
VAR StringToPath =
    SUBSTITUTE ( LongString, ":", "|" )
VAR PathToTable =
    ADDCOLUMNS (
        GENERATESERIES ( 1, LEN ( StringToPath ) ),
        "Item", PATHITEM ( StringToPath, [Value] )
    )
VAR GroupItems =
    FILTER (
        SUMMARIZE ( PathToTable, [Item] ),
        NOT ISBLANK ( [Item] )
    )
RETURN
    CONCATENATEX ( GroupItems, [Item], ":" )

让您的桌子如下所示-

现在尝试下面的高级编辑器代码,在电源查询编辑器-

let
    Source = Table.FromRows(Json.Document(Binary.Decompress(Binary.FromText("i45WcnS0cnKycnZWitWJVgKyXFzALBcXK6CMqyuY4+oK4gCFnJxgykAysQA=", BinaryEncoding.Base64), Compression.Deflate)), let _t = ((type nullable text) meta [Serialized.Text = true]) in type table [ColumnHeader = _t]),
    #"Changed Type" = Table.TransformColumnTypes(Source,{{"ColumnHeader", type text}}),
    
    
    //--NEW STEPS STARTS FROM HERE
    #"Added Index" = Table.AddIndexColumn(#"Changed Type", "Index", 1, 1, Int64.Type),
    #"Reordered Columns" = Table.ReorderColumns(#"Added Index",{"Index", "ColumnHeader"}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Reordered Columns", "ColumnHeader", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"ColumnHeader.1", "ColumnHeader.2", "ColumnHeader.3", "ColumnHeader.4"}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"ColumnHeader.1", type text}, {"ColumnHeader.2", type text}, {"ColumnHeader.3", type text}, {"ColumnHeader.4", type text}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type1", {"Index"}, "Attribute", "Value"),
    #"Removed Columns" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute", "Index"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns"),
    #"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"Value", Order.Ascending}}),
    #"Added Index1" = Table.AddIndexColumn(#"Sorted Rows", "Index", 1, 1, Int64.Type),
    #"Reordered Columns1" = Table.ReorderColumns(#"Added Index1",{"Index", "Value"}),
    #"Pivoted Column" = Table.Pivot(Table.TransformColumnTypes(#"Reordered Columns1", {{"Index", type text}}, "en-US"), List.Distinct(Table.TransformColumnTypes(#"Reordered Columns1", {{"Index", type text}}, "en-US")[Index]), "Index", "Value", List.Max),
    #"Merged Columns" = Table.CombineColumns(#"Pivoted Column",{"1", "2", "3", "4", "5"},Combiner.CombineTextByDelimiter(":", QuoteStyle.None),"Merged")
in
    #"Merged Columns"
这是最终输出-


以下是电源查询编辑器中的代码-

使用以下代码按组创建一个新表-

let
    Source = TABLE_BY_ELEMENT,
    #"Removed Columns" = Table.RemoveColumns(Source,{"KEY", "KEY_DATA"}),
    #"Split Column by Delimiter" = Table.SplitColumn(#"Removed Columns", "LIST", Splitter.SplitTextByDelimiter(":", QuoteStyle.Csv), {"LIST.1", "LIST.2", "LIST.3"}),
    #"Changed Type" = Table.TransformColumnTypes(#"Split Column by Delimiter",{{"LIST.1", type text}, {"LIST.2", type text}, {"LIST.3", type text}}),
    #"Unpivoted Other Columns" = Table.UnpivotOtherColumns(#"Changed Type", {"GROUP"}, "Attribute", "Value"),
    #"Removed Columns1" = Table.RemoveColumns(#"Unpivoted Other Columns",{"Attribute"}),
    #"Removed Duplicates" = Table.Distinct(#"Removed Columns1"),
    #"Sorted Rows" = Table.Sort(#"Removed Duplicates",{{"GROUP", Order.Ascending}, {"Value", Order.Ascending}}),
    #"Grouped Rows" = Table.Group(#"Sorted Rows", {"GROUP"}, {{"all", each _, type table [GROUP=nullable text, Value=text]}}),
    #"Added Custom" = Table.AddColumn(#"Grouped Rows", "NewList", each [all][Value]),
    #"Extracted Values" = Table.TransformColumns(#"Added Custom", {"NewList", each Text.Combine(List.Transform(List.Sort(_), Text.From), ":"), type text}),
    #"Removed Columns2" = Table.RemoveColumns(#"Extracted Values",{"all"}),
    #"Merged Queries" = Table.NestedJoin(#"Removed Columns2", {"GROUP"}, TABLE_BY_GROUP, {"GROUP"}, "TABLE_BY_GROUP", JoinKind.LeftOuter),
    #"Expanded TABLE_BY_GROUP" = Table.ExpandTableColumn(#"Merged Queries", "TABLE_BY_GROUP", {"GROUP_DATA      "}, {"TABLE_BY_GROUP.GROUP_DATA      "}),
    #"Renamed Columns" = Table.RenameColumns(#"Expanded TABLE_BY_GROUP",{{"TABLE_BY_GROUP.GROUP_DATA      ", "GROUP_DATA"}}),
    #"Changed Type1" = Table.TransformColumnTypes(#"Renamed Columns",{{"GROUP", type text}, {"NewList", type text}, {"GROUP_DATA", Int64.Type}})
in
    #"Changed Type1"
这是最终输出-


您可以很容易地可视化对表结果\u元素的第二个要求使用基本表表\u BY \u元素

在Power Query/M中执行此操作可能是最好的,而不是DAX如果您有10行,您希望最终输出为1行/列?如果没有,请显示您的输入和输出与现在完全相同,以及您希望最终输出的方式。我将尝试将其拆分为几行。使用查询编辑器,每个值1行。。。最终的结果是,我想根据行id的切片器选择(数据示例中未显示)查看卡(或表的一行)中的值,允许多选。嗨,Alexi,谢谢,这似乎是一个有趣的解决方案。我正在一个样本上测试这个,并在查询编辑器中分割数据。我现在看到了两个问题:-它将使我的桌子大4倍:大约4x15000=60000行。可以吗我将列表创建为一个新列,但我始终拥有整个列表的所有值。关键是:如果我只过滤奇数ID,列表将不会更新。如何在我的可视化中实现这一点?谢谢,60K行就可以了。你需要让列表成为一个度量,而不是一个计算列,它才是动态的。好吧,太好了!!明天,我将尝试使用完整的数据集进行此操作。只需检查最后两点:。。。1/我需要为此创建一个额外的表,这样在拆分列中的数据(示例中未显示键)时不会破坏键的唯一性。对吗。。。2/我希望计算列考虑行上下文。如何将代码更改为考虑“组”列,并且只应使用同一组中的行进行连接?因此,您可能确实需要将其创建为一个新表,从原始表ID到新表ID之间具有一对多关系。将其作为度量值(而不是计算列)写入将允许其基于筛选器上下文进行计算。它应该会自动响应您的过滤器、切片器和您放置它的视觉所创建的上下文。您好,谢谢!嗨,我是这样做的,效果很好。嗨,谢谢这个例子。我注意到我有更复杂的现实生活数据。如果我有一个额外的名为“GROUP”的列,并且我希望对每个组进行一次连接,那么是否可以这样做。第1组有第1行和第2行,第2组有第3、4、5行?结果就像一个两行表:group1aa:BB:CC:DD;第2组AA:BB:DD:EE。是否可以使用Power Query执行此操作?谢谢。我应该在这里添加更详细的样本数据吗?或者我应该发布一个新问题吗?可能。。。请提供更多的示例数据以供理解。您好,我添加了一组更大的数据和需要查找的结果。如果您仍然认为这是可能的话,我对您使用PowerQuery的方式很感兴趣。ThanksHi@Malo,请检查我对您的新案例的另一个答案。我无法复制粘贴下面的cod://--新步骤从这里开始,因为我有错误。也许我的POwerBi的不同版本?你能告诉我一步一步的过程吗,这样我就可以在Power Query图形编辑器中重现它了?你从哪里得到的?/--新的步骤从这里开始?新代码不包含此行。如果表的确切名称为table_BY_元素,table_BY_组,所有列名如示例所示,那么只需复制和粘贴代码即可。