[ 初めての方へ | 一覧(最新更新順) | 全文検索 | 過去ログ ]
『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
先ほどのだと、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
もし、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.