なんでもエクセル(Nandemo Excel)

何でもエクセルでやってしまう そこのあなた。ようこそ

Power Query:テーブルの組み換えB(行のグループ化の応用)

今回は「テーブルの組み換えA」の完全な逆パターン。

こういう縦並びのデータを組み換えて、

グループ別で横並びに組み替える。

普通に横並びにするだけなら「行のグループ化+連番追加&列のピボット」で済むけども、「品名」と「数量」のように複数の列が1セットになっている場合は、そう簡単にいかない。

というのも、グループ化の操作で「集計しない」を選択するとテーブルが返るが、このテーブルを展開(Table.ExpandTableColumn)しても縦方向にしか並ばない(要はグループ化する前に戻る)。横に展開したい時は、グループ化の際に一工夫が必要になる。


    行のグループ化 = Table.Group(テーブル1, {"氏名"}, {"テーブル", each [         列の選択 = Table.SelectColumns(_, {"品目", "数量"}),         列のピボット解除 =         Table.UnpivotOtherColumns(列の選択, {}, "属性", "値"),         値レコード = Table.Transpose(列のピボット解除){1}     ][値レコード], type record}),

このようにグループ化の結果を加工してレコードを作ってやる。この列を展開(Table.ExpandRecordColumn)すると……

こんな感じで横に並んでくれる。

見出し列にこだわりがないならこれで終了なんけど、「品名1」「数量1」「品名2」「数量2」……となって欲しい場合は、見出しを作ってから展開して列名変更が必要。


    旧列名リスト = Record.FieldNames(         Record.Combine(行のグループ化[レコード])     ),     新列名リスト = [         リスト = {1..List.Count(旧列名リスト)/2},         編集 = List.Transform(リスト, each {             Number.ToText(_, "品名0"), Number.ToText(_, "数量0")         }),         結合 = List.Combine(編集)     ][結合],     列の展開 = Table.ExpandRecordColumn(         行のグループ化, "テーブル", 旧列名リスト     ),     列名の変更 = Table.RenameColumns(         列の展開, List.Zip({旧列名リスト, 新列名リスト})     )

これで見出しも含めて見やすくなった。