見出し画像

PowerQuery 中間テーブルを減らそう

はじめに

PowerQueryでデータを加工していると、表示したくない中間テーブルができてしまう時はないでしょうか?
例えば、AテーブルにBテーブルをグループ集計したbテーブルをLeftJoinしたい時、bテーブルが残ってしまうの邪魔だなみたいな感じです。

今回は、PowerQueryで発生する中間テーブル問題の解消法について書いていきたいと思います。

条件

下記売上テーブルを営業所コードでグループ集計し、営業所マスタにLeftJoinする場合について考えてみます。
営業所マスタテーブルと売上テーブルは別テーブルでも使用するため、このままのテーブルで残しておく必要があるとします。

営業所マスタテーブル
売上テーブル

オーソドックスな作成方法

どちらのテーブルもそのまま残しておく前提条件のため、売上テーブルを参照してグループ集計し、営業所マスタテーブルを参照したクエリにLeftJoinする記述になるかと思います。

/*Temporary_集計テーブル*/
/*売上集計テーブル*/
let
    ソース = 売上テーブル,
    グループ集計 = Table.Group(ソース, {"営業所コード"}, {{"売上", each List.Sum([売上]), type nullable number}})
in
    グループ集計
/*目的テーブル*/
/*営業所マスタにLeftJoin*/
let
    ソース = 営業所マスタ,
    集計テーブルをLeftJoin = Table.NestedJoin(ソース, {"営業所コード"}, Temporary_集計テーブル, {"営業所コード"}, "Temporary_集計テーブル", JoinKind.LeftOuter),
    集計テーブルを展開 = Table.ExpandTableColumn(集計テーブルをLeftJoin, "Temporary_集計テーブル", {"売上"}, {"売上"})
in
    集計テーブルを展開
中間テーブルを含めて4つテーブルができる

どうやってクエリを減らすか

答えは「クエリをネストする」です。
PowerQueryの記述は下記のようになっています。

let
     Step1 = …… ,
     Step2 = …… ,
     …..
in
最後に適用するStep名

これはクエリ中にネストして書くことができます。
下記のコードを確認してください。

let

    集計テーブル = let

        グループ集計 = Table.Group(売上テーブル, {"営業所コード"}, {{"売上", each List.Sum([売上]), type nullable number}})
    
   in
    グループ集計,

    ソース = 営業所マスタ,
    集計テーブルをLeftJoin = Table.NestedJoin(ソース, {"営業所コード"}, 集計テーブル, {"営業所コード"}, "集計テーブル", JoinKind.LeftOuter),
    集計テーブルを展開 = Table.ExpandTableColumn(集計テーブルをLeftJoin, "集計テーブル", {"売上"}, {"売上"})
in
    集計テーブルを展開
1ステップずつの処理の様子

集計テーブル(中間テーブル名) = let ~ でネストした集計クエリが1Stepとして適用されていることがわかります。
上記Queryであれば、中間テーブルは不要で一発で目的テーブルを導出できます。

他にも複数の列追加をする場合に、ステップ数が多くなりすぎてしまう場合なども、クエリをネストして記述することで問題解決できたりします。

おわりに

クエリをネストすると複数のステップを1ステップとして処理できる反面、1ステップ毎の動きが読みづらくなるデメリットもあります。
中間テーブルが多すぎて困っていたり、ステップ数が多すぎて見辛い場合など活用してみてください。

参考になれば幸いです。
最後までお読みいただき、ありがとうございました。

この記事が気に入ったらサポートをしてみませんか?