Power Query | 動的SQLの実行結果を取り込む方法(Power BI)

SQLクエリの条件(例えばWHERE句)とPower Queryのパラメーターを連携させて、動的にSQLを実行する方法を説明します。

技術公開日 読了目安 2 分

Power Queryでは、データベースに接続してSQLの実行結果をテーブルとして取り込むことがよくあります。では、そのSQLクエリの絞り込み条件(例えばWHERE句の中)を簡単に変更したい場合はどうすればよいでしょうか。

今回は、SQLクエリの条件(例えばWHERE句)とPower Queryのパラメーターを連携させて、動的にSQLを実行する方法について説明します。

動的SQLを実行するクエリ

動的SQLを実行するクエリの例は以下の通りです。

let
// ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----
// SQL starts here
sql1 =
"
SELECT
  *
FROM
  test_table
WHERE
  start_date >= '__start_date__' AND start_date <= '__end_date__'
",
// SQL ends here
// ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ---- ----

    // Replace SQL variables (e.g., __start_date__ and __end_date__)
    sql2 = Text.Replace(sql1, "__start_date__", START_DATE),
    sql3 = Text.Replace(sql2, "__end_date__", END_DATE),

    sql = sql3, // Reassign it as 'sql' to prevent errors

    Source = Oracle.Database(DB_NAME, [HierarchicalNavigation=true, Query=sql])
in
    Source

この例では、処理の流れは以下の通りです。

① sql1

// SQL starts here
sql1 =
"
SELECT
  *
FROM
  test_table
WHERE
  start_date &gt;= '__start_date__' AND start_date &lt;= '__end_date__'
",
// SQL ends here

この部分には、ベースとなるSQL(// ---の間)が記載されています。動的に変更したい箇所は、変数(例えば__start_date__や__end_date__)として記載しています。

② sql2

sql2 = Text.Replace(sql1, "__start_date__", START_DATE)

sql2は、sql1内の__start_date__をSTART_DATE(パラメーター)に置き換えます。この例では、START_DATEはYYYYMMDD形式の文字列を保持しています。

③ sql3

sql3 = Text.Replace(sql2, "__end_date__", END_DATE)

sql3は、sql2内の__end_date__をEND_DATE(パラメーター)に置き換えます。この例では、END_DATEはYYYYMMDD形式の文字列を保持しています。

④ sqlとSource

    sql = sql3, // Reassign it as 'sql' to prevent errors

    Source = Oracle.Database(DB_NAME, [HierarchicalNavigation=true, Query=sql])

sql3をsqlに格納し、それをOracle.Database関数の引数として適用します。この例では、DB_NAMEはデータベース名(スキーマ)を保持しています。


実際に試す際は、必要なパラメーターを準備した上で、空のクエリからAdvanced Editorに上記のコードを貼り付けてください。

パラメーターの設定を変更することで、動的にSQLの抽出結果を変更することができます。以上です。