データベースに接続して一つのテーブルをインポートするのは比較的簡単であるが,複数のテーブルを結合した状態でインポートする方法が長らく分からないままだった.
Power Query を使ってクエリを結合する方法で解決したので備忘録がてら記事とする.
データの取得
SQL Server への接続
「データ」「データの取得」「データベースから」「SQL Server データベースから」と進む.


認証
このデータベースは Windows 認証を用いているため,何も変更せずそのまま「接続」をクリックする.

「暗号化のサポート」で注意書きが出るが,構わずにOKをクリックする.

ナビゲーターでテーブルを選択
初期状態では「複数のアイテムの選択」にチェックが入っていない.

ナビゲーターの「複数のアイテムの選択」のチェックをオンにすると複数のテーブルが選択できるようになる.

ここで「読み込み」をクリックすると接続情報のみが記録される.

「読み込み先…」を確認すると下図のようになっている.

この後,ピボットテーブルを作成するのか,テーブルを作成するのかで選択肢が変わってくる.
ピボットテーブルを作成する場合
データモデルをデータソースとする
「挿入」「ピボットテーブル」と進む.

「ピボットテーブルの作成」で「このブックのデータモデルを使用する」にチェックが入っている.そのまま OK をクリックする.

ピボットテーブルのフィールド
下図のようにチェックしたテーブルが二つ並んでいる.

展開すると下図のようにフィールドが見えるようになる.

この後はピボットグラフを作成していくのだが,そこは省略する.
スライサーの挿入
ピボットテーブルにはスライサーなるものがある.テーブルのフィルターから,チェックボックスだけ引っ張り出したフローティングメニューのような代物である.
「ピボットグラフ分析」「スライサーの挿入」と進む.

下図のようなダイアログに遷移する.

スライサーとは何か?
形式的には BI 界隈で言うところのディメンションである.リレーショナルデータベースの立場からは外部キーの一部である.ヒト,モノ,カネと言うが,事業を集計する際の集約のための次元である.
SQL で言うところの GROUP BY に続くキーである.ここでは地方区分を意味する Region にチェックを入れるが,都道府県単位の粒度が必要なら PrefectureCode にチェックを入れることになる.

スライサーができた
下図のようにスライサーができた.これはテーブルのフィルターのチェックボックスで「すべて選択」がチェックされているのと同じ状態である.

タイムラインの挿入は日付型のデータが入っていないと失敗する
続けてタイムラインの挿入をしようとしたが,日付型のデータが無いとエラーが発生した.


テーブル間のリレーションシップ
メジャーである D2211 というフィールドには数値型のデータが入っているのだが,このフィールドを「Σ値」のボックスにドロップすると EXCEL が自動的に警告を出してくる.

確かに必要だ.自動検出をクリックしてみる.上手くいったらしい.

念のため確認しておこう.「リレーションシップの管理…」をクリクする.
リレーションシップの管理
下図の画面に遷移する.テーブルとキーが表示されている.大丈夫だと思うが,「編集…」をクリックしてさらに内容を確認する.

リレーションシップの編集
「このリレーションシップに使用するテーブルと列の選択」と長い説明があるが,要はテーブル間の結合キーを示している.
FROM D2211 INNER JOIN M_City ON D2211.CityCode = M_City.CityCode

ふと疑問に思ったのだが,結合キーが一つなら上記ダイアログで良いのだが,二つ以上の結合キーが存在する場合はどうなるのだろう?
テーブルを作成する場合
読み込み先をテーブルに切り替える
「クエリと接続」を右クリックして「読み込み先…」を選ぶ.

「データのインポート」ダイアログで「テーブル」にチェックを付ける.

クエリの結合
そのままインポートすると,テーブルが結合されずにインポートされるだけである.何か方法はないか探し回ってみると,「クエリ」タブがあるのに気がついた.「結合」とそれらしいキーワードが見える.

クリックすると「マージ」画面に遷移する.「結合の種類」に「左外部」とある.それらしい匂いがしてきた.

「結合の種類」をポップアップすると「左外部」「右外部」「完全外部」「内部」「左反」「右反」がメニューに現れる.最後の二つは不明だが,最初の四つでほぼ事足りる.

テーブルと照合列を選択した状態である.これで一番下にチェックマークがついている.どうやらこれで大丈夫のようだ.OKをクリックする.

Power Query エディターに遷移する
D2211 テーブルの右側に M_City テーブルが並んで表示されている.このまま慌てて「閉じて読み込む」を選んではいけない.

M_City の列名の右側にそれらしいボタンがある.クリックしてみると下図のようにテーブルの列名がチェックボックス形式でポップアップする.

不要な列のチェックを外し,OKをクリックする.これは下記のコードに該当する.
SELECT PrefectureCode , Prefecture , Region

無事,マスターの項目が展開された.

「クエリと接続」では新しく Merge1 という名のクエリが出来ている.

Power Query エディターの詳細エディターで DAX 式を確認してみる.
let ソース = Table.NestedJoin(D2211, {"CityCode"}, M_City, {"CityCode"}, "M_City", JoinKind.Inner), #"展開された M_City" = Table.ExpandTableColumn(ソース, "M_City", {"PrefectureCode", "Prefecture", "Region"}, {"M_City.PrefectureCode", "M_City.Prefecture", "M_City.Region"}) in #"展開された M_City"
まとめ
SQL Server に接続して複数のテーブルをインポートした.それらを Power Query で結合して EXCEL のテーブルにインポートした.クエリを結合することをマージという.結合キーが一つなら問題ないが,結合キーが複数の場合に課題が残る.その場合はデータベース側で結合するのが妥当と思われる.