[[20240115114720]] 『PowerQueryの「その他の列のマージ」』(てつ) ページの最後に飛ぶ

[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]

 

『PowerQueryの「その他の列のマージ」』(てつ)

以下のような元表を、「項目1」と「項目2」でマージすると
右の表のようになりますが、項目列が日々増加するので、
項目列数が不明の場合、「ID」列以外をマージとするというようにしたいのですが、どうすればいいですか?
「その他の列のピボット解除」のマージ版のイメージです。

 let
 ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    結合された列 = Table.CombineColumns(ソース,{"項目1", "項目2"},Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"結合済み")
 in
    結合された列

 ID	項目1	項目2		ID	結合済み
 1	リンゴ	赤		1	リンゴ,赤
 2	みかん	橙		2	みかん,橙
 3	バナナ	黄		3	バナナ,黄

< 使用 Excel:Excel2016、使用 OS:Windows10 >


 ある程度M関数を自分で打ち込めるようにならないといけないので、ちょっと大変かもですが、

 このあたりを使って

 Table.CombineColumns
https://learn.microsoft.com/ja-jp/powerquery-m/table-combinecolumns

 Table.ColumnNames
https://learn.microsoft.com/ja-jp/powerquery-m/table-columnnames

 List.Range
https://learn.microsoft.com/ja-jp/powerquery-m/list-range

 こんな感じ
 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    結合された列 = Table.CombineColumns(ソース,List.Range(Table.ColumnNames(ソース),1),Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"結合済み")
 in
    結合された列
(´・ω・`) 2024/01/15(月) 12:13:45

うわ-。速攻で解決です。
メニューにない事をやろうとすると、一気に難易度が上がりますね。
自分でも書けるように、精進します。どうも、ありがとうございました。
(てつ) 2024/01/15(月) 12:27:20

 先ほどのだと、ID列が一番左にあることを前提にしているので、
 >「ID」列以外
 であれば、
 List.Select
https://learn.microsoft.com/ja-jp/powerquery-m/list-select
 をつかって

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    結合された列 = Table.CombineColumns(ソース,List.Select(Table.ColumnNames(ソース),each _<>"ID"),Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"結合済み")
 in
    結合された列

 とした方がいいのかもしれません 
(´・ω・`) 2024/01/15(月) 12:52:04

追記、ありがとうございます。

すみません。もし、おわかりなら、追加で教えてください。
元の列を残す場合も同様なことが可能でしょうか?

「列の追加」タブ「列のマージ」を実行した場合

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    挿入された結合列 = Table.AddColumn(ソース, "結合済み", each Text.Combine({[項目1], [項目2]}, ","), type text)
 in
    挿入された結合列
(てつ) 2024/01/15(月) 12:55:17

あ、複製を作ってから、Table.CombineColumnsすればいいのか...
すみません。ぼけてました。

もし、M関数でもっと簡潔に書けるなら、教えてください。
(てつ) 2024/01/15(月) 13:03:58


 こんな感じになります。
 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    挿入された結合列 = Table.AddColumn(ソース, "結合済み", each Text.Combine( List.Range(Record.ToList(_),1) , ","), type text)
 in
    挿入された結合列
(´・ω・`) 2024/01/15(月) 13:18:11

 追記です

 >複製を作ってから、Table.CombineColumnsすればいいのか...
 それでいいと思います。

 PowerQueryは実行時に最適化してくれるみたいなので、
 途中の実行しなくてよいステップは(たぶん)実行時はすっ飛ばしてくれる(はず)なので、
 ステップの少なさよりわかりやすさを優先して書いても、あまり速度には影響しないかも
(´・ω・`) 2024/01/15(月) 13:24:07

´・ω・`様、ありがとございます。できました。

自分で考えたのでも、できましたが、簡潔さが違いますね。
理解して、使わせてもらいます。
どうも、ありがとうございました。

一応、自分で考えたのも「どんくさい見本」で、置いときます。

 let
    ソース = Excel.CurrentWorkbook(){[Name="テーブル1"]}[Content],
    結合された列 = Table.CombineColumns(ソース,List.Select(Table.ColumnNames(ソース),each _<>"ID"),Combiner.CombineTextByDelimiter(",", QuoteStyle.None),"結合済み"),
    マージされたクエリ数 = Table.NestedJoin(ソース, {"ID"}, 結合された列, {"ID"}, "結合された列", JoinKind.LeftOuter),
    #"展開された 結合された列" = Table.ExpandTableColumn(マージされたクエリ数, "結合された列", {"結合済み"}, {"結合済み"})
 in
    #"展開された 結合された列"
(てつ) 2024/01/15(月) 13:31:29

コメント返信:

[ 一覧(最新更新順) ]


YukiWiki 1.6.7 Copyright (C) 2000,2001 by Hiroshi Yuki. Modified by kazu.