質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.30%

Q&A

1回答

163閲覧

パワークエリの一部をパラメータ(変数にしたい)

Hikoans

総合スコア14

0グッド

0クリップ

投稿2025/04/22 06:33

編集2025/04/22 06:55

実現したいこと

パワークエリの一部をパラメータ(変数にしたい)です。

発生している問題・分からないこと

以下のようにSQLをODBCでクエリにしているのですが、例えば日付やEntity Numberの部分をパラメータ化したいのですが、どうすれば良いでしょうか?できればその都度ユーザに尋ねるようにしたいです。

該当のソースコード

let ソース = Odbc.Query("dsn=db", "SELECT COALESCE(株式残高.[Base Market Value],0)+ COALESCE(未収配当,0) AS 時価総額, *#(lf)FROM ((SELECT [Security ID] from t1 where [Accounting Date]='2025/02/28' and [Entity Number]='9999' and [Investment Type Code]='EQ'Union select [Security ID] from t2 where [Accounting Date]='2025/02/28' and [Entity Number]='9999') AS master LEFT JOIN (SELECT * FROM t1 WHERE [Accounting Date]='2025/02/28' and [Entity Number]='9999' and [Investment Type Code]='EQ') AS 株式残高 ON 株式残高.[Security ID] = master.[Security ID]) LEFT JOIN (SELECT [Accounting Date], [Entity Number], [Security ID], Sum([Base Market Value Receivable]) AS 未収配当 FROM t2 WHERE [Accounting Date]='2025/02/28' and [Entity Number]='9999' GROUP BY [Accounting Date], [Entity Number], [Security ID]) AS 未収 ON 未収.[Security ID] = master.[Security ID];#(lf)") in ソース

試したこと・調べたこと

  • teratailやGoogle等で検索した
  • ソースコードを自分なりに変更した
  • 知人に聞いた
  • その他
上記の詳細・結果

色々調べましたが、パワークエリに不慣れでよく分かりません。

補足

特になし

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sk.exe

2025/04/22 09:20

> 例えば日付やEntity Numberの部分をパラメータ化したい > WHERE [Accounting Date]='2025/02/28' and [Entity Number]='9999' WHERE 句においてそれぞれのフィールドと比較しているリテラルを 2つのパラメータで指定できるようにしたい、という意味であるとして、 - それぞれのパラメータを入力必須とするのか、それとも省略可能とするのか。 - 省略可能とした場合、WHERE 句での扱いはどのようになるのか。  ( 列の値が null であるレコードが抽出されるようにする、  あるいは比較条件そのものを書き加えないようにする等) といった問題を検討しなければならないでしょう。 > できればその都度ユーザに尋ねるようにしたいです。 また、上記の機能をどのような形で実装なさりたいのでしょうか。 例えば「 VBA の InputBox のようなダイアログボックスを 『その都度』表示させたい」場合、具体的にどのタイミングで (ユーザーがどのような操作が行なった時に)そのダイアログを表示させ、 入力された値を各パラメータに渡してクエリの再読込を実行するのか、 という問題が生じます。 「ユーザー自身が Power Query エディターを開いて各パラメータの値を直接変更する」 あるいは「同じブックのワークシート上に作成されたテーブルのセルをパラメータ代わりとし、 それぞれのセルの値をユーザーが任意に変更する」という(いちいち入力を促さない) オペレーションを想定されているならば、その部分についてはある程度無視できるのですが。
Hikoans

2025/04/22 09:48

ありがとうございます。 イメージはクエリを更新した際、ダイアログボックスが表示されるような仕様でしたが、以下なような仕様でも大丈夫です。極力簡単に書ける方法を探しています。 「同じブックのワークシート上に作成されたテーブルのセルをパラメータ代わりとし、 それぞれのセルの値をユーザーが任意に変更する」という(いちいち入力を促さない) オペレーション よろしくお願いいたします。
guest

回答1

0

同じブックのワークシート上に作成されたテーブルのセルをパラメータ代わりとし、 それぞれのセルの値をユーザーが任意に変更する

では、とりあえずの作成例を挙げます。

条件パラメータ用のテーブルおよびクエリの作成

  • そのブックに以下のようなテーブル(以下[条件パラメータテーブル])を作成する(データ行の各セルの表示形式を先に設定してからセルの値を入力すること)。

イメージ説明

  • [条件パラメータテーブル]のいずれかのセルを選択し、[データ]タブ -> [データの取得と変換]グループ -> [テーブルまたは範囲から]をクリックする(この時 Power Query エディターが起動し、自動的にクエリが新規作成される)。

  • [クエリの設定]ウィンドウより、新規作成されたクエリの名前を任意の名前に変更する(ここでは[パラメータ取得クエリ]とする)。

  • [クエリの設定]ウィンドウより Table.TransformColumnTypes 関数を呼び出しているステップ(既定のオプション設定なら[変更された型]という名前になっているはず)を選択する。

  • ([Accounting Date]列のデータ型が datetime 型になっていない場合)プレビューウィンドウより[Accounting Date]列全体を選択(列見出しをクリック)し、[ホーム]タブ -> [変換]グループ -> [データ型]をドロップダウンし、「日付/時刻」を選択する。[列タイプの変更]ダイアログが表示されたら、[現在のものを置換]ボタンをクリックする(エラーが返された場合は[条件パラメータテーブル]側のデータを何とかすること)。

  • ([Entity Number]列のデータ型が text 型になっていない場合)プレビューウィンドウより[Entity Number]列全体を選択(列見出しをクリック)し、[ホーム]タブ -> [変換]グループ -> [データ型]をドロップダウンし、「テキスト」を選択する。[列タイプの変更]ダイアログが表示されたら、[現在のものを置換]ボタンをクリックする(エラーが返された場合は[条件パラメータテーブル]側のデータを何とかすること)。

  • [ホーム]タブ -> [閉じる]グループ -> [閉じて読み込む]をドロップダウンし、[閉じて次に読み込む]を選択する。

  • [データのインポート]ダイアログが表示されたら、[接続の作成のみ]を選択して[OK]ボタンをクリックする。

既存のクエリの編集

let ソース = Odbc.Query("dsn=db", "SELECT COALESCE(株式残高.[Base Market Value],0)+ COALESCE(未収配当,0) AS 時価総額, *#(lf)FROM ((SELECT [Security ID] from t1 where [Accounting Date]='2025/02/28' and [Entity Number]='9999' and [Investment Type Code]='EQ'Union select [Security ID] from t2 where [Accounting Date]='2025/02/28' and [Entity Number]='9999') AS master LEFT JOIN (SELECT * FROM t1 WHERE [Accounting Date]='2025/02/28' and [Entity Number]='9999' and [Investment Type Code]='EQ') AS 株式残高 ON 株式残高.[Security ID] = master.[Security ID]) LEFT JOIN (SELECT [Accounting Date], [Entity Number], [Security ID], Sum([Base Market Value Receivable]) AS 未収配当 FROM t2 WHERE [Accounting Date]='2025/02/28' and [Entity Number]='9999' GROUP BY [Accounting Date], [Entity Number], [Security ID]) AS 未収 ON 未収.[Security ID] = master.[Security ID];#(lf)") in ソース
  • 再び Power Query エディターを起動し、作成済みである上記のクエリを選択する。

  • [ホーム]タブ -> [クエリ]グループ -> [詳細エディター]をクリックする。

  • クエリを以下のように書き換える。

PowerQuery

1let 2 会計処理日の条件 = DateTime.ToText(パラメータ取得クエリ{0}[Accounting Date], "yyyy/MM/dd"), 3 企業番号の条件 = Text.Replace(パラメータ取得クエリ{0}[Entity Number],"'","''"), 4 SQL文 = "SELECT COALESCE(株式残高.[Base Market Value],0)+ COALESCE(未収配当,0) AS 時価総額, *#(lf)FROM ((SELECT [Security ID] from t1 where [Accounting Date]='" & 会計処理日の条件 & "' and [Entity Number]='" & 企業番号の条件 & "' and [Investment Type Code]='EQ' Union select [Security ID] from t2 where [Accounting Date]='" & 会計処理日の条件 & "' and [Entity Number]='" & 企業番号の条件 & "') AS master LEFT JOIN (SELECT * FROM t1 WHERE [Accounting Date]='" & 会計処理日の条件 & "' and [Entity Number]='" & 企業番号の条件 & "' and [Investment Type Code]='EQ') AS 株式残高 ON 株式残高.[Security ID] = master.[Security ID]) LEFT JOIN (SELECT [Accounting Date], [Entity Number], [Security ID], Sum([Base Market Value Receivable]) AS 未収配当 FROM t2 WHERE [Accounting Date]='" & 会計処理日の条件 & "' and [Entity Number]='" & 企業番号の条件 & "' GROUP BY [Accounting Date], [Entity Number], [Security ID]) AS 未収 ON 未収.[Security ID] = master.[Security ID];#(lf)", 5 ソース = Odbc.Query("dsn=db", SQL文) 6in 7 ソース
  • 構文エラーがないことを確認したら、[完了]ボタンをクリックする。

  • プレビューウィンドウに「接続方法を指定してください」という警告バーが表示された場合は、[資格情報の編集]を適宜行なう。

投稿2025/04/22 14:30

sk.exe

総合スコア1095

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.30%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問