BI探検ノート

基本 練習問題 16 / 31

別の表から商品名を持ってくる(VLOOKUP の代わり)

目的(何のためにやるか)

別の表(商品名の表など)を、コードでつないで、レポートに名前を出すための練習です。Excel の VLOOKUP に当たる作業です。

状況

売上の表には商品コードしかなく、商品名は別の表(products.csv)にあります。Excel なら VLOOKUP で持ってくるところです。

準備

  1. CSV をダウンロードします(ダミーのデータです)。
  2. Power BI Desktop で、CSV を読み込みます。やり方は、はじめかたにあります。

やること

  1. sales_agg と products を読み込み、Power Query で、売上の表に商品名を足す。
  2. products の代わりに products_missing(1003 がない)で同じことをして、商品コード 1003 の行がどうなるかを見る。
  3. products_dup(1001 が2行ある)で同じことをして、行の数がどうなるかを見る。

まず、下を見ずに、自分でやってみてください。うまくいかなければ、ここから下の解説を、上から順に、読みながら、やってみます。

解き方(ステップごとの解説・画面つき)

  1. 2つ目の表と、結合の列を選ぶ

    「クエリのマージ」を開く

    「データの変換」で Power Query エディターを開き、左の一覧で、売上のクエリ(sales_agg)を選びます。「ホーム」の右のほうの「クエリのマージ」を押すと、「マージ」のダイアログが出ます。上に、売上の表が出ています。

    ダイアログの真ん中のドロップダウンから、「products」を選びます。そして、上の表の「商品コード」の見出しと、下の表の「商品コード」の見出しを、それぞれクリックします。見出しの色が変わり、下に「選択範囲では、最初のテーブルと 6 行中 6 行が一致しています」と出ました。

    マージのダイアログ。上に売上の表、下に商品の表。商品コードを選び、6行中6行が一致しますと出ている
    マージのダイアログ。上に売上の表、下に商品の表。商品コードを選び、6行中6行が一致しますと出ている

    「結合の種類」は、「左外部(最初の行すべて、および 2 番目の行のうち一致するもの)」が、最初から選ばれていました。このまま、OK を押しました。

  2. 新しい列「products」(中身は「Table」)

    売上の表の右に、新しい列「products」ができました。セルには、どれも「Table」と出ています。まだ、商品名は出ていません。式の欄は、Table.NestedJoin(変更された型, {"商品コード"}, products, {"商品コード"}, "products", JoinKind.LeftOuter) でした。

    売上の表の右に、products という列ができ、各セルに Table と出ている
    売上の表の右に、products という列ができ、各セルに Table と出ている
  3. 見出しの右のボタンで「展開」

    「products」の見出しの右のボタンを押すと、展開の画面が出ます。「(すべての列の選択)」「商品コード」「商品名」にチェックが付いていて、下に「元の列名をプレフィックスとして使用します」のチェックが付いています。

    展開の画面。商品コードと商品名にチェックが付き、元の列名をプレフィックスとして使用しますにもチェックが付いている
    展開の画面。商品コードと商品名にチェックが付き、元の列名をプレフィックスとして使用しますにもチェックが付いている

    ここでは、「商品コード」のチェックを外し(売上の表に、すでにあるため)、「元の列名をプレフィックスとして使用します」も外して、OK を押しました。式は、Table.ExpandTableColumn(マージされたクエリ数, "products", {"商品名"}, {"商品名"}) になりました。

  4. 商品名が足される

    売上の各行に、「商品名」の列が足されました。1001 は「りんご」、1002 は「みかん」、1003 は「ぶどう」です。

    売上の表に、商品名の列が足された。りんご、りんご、みかん、ぶどう、みかん、ぶどう
    売上の表に、商品名の列が足された。りんご、りんご、みかん、ぶどう、みかん、ぶどう

    行の順番が変わりました。 元の CSV は、「渋谷 1001、渋谷 1002、新宿 1001、新宿 1003、京都 1002、京都 1003」の順でしたが、マージのあとは、「渋谷 1001、新宿 1001、渋谷 1002、新宿 1003、京都 1002、京都 1003」の順で、2行目と3行目が入れ替わっていました。順番に意味があるデータ(時系列の並びなど)では、この点に気をつけてください。理由は、確かめていません。

  5. 商品コードが一致しない行があるとき

    商品の表から、1003(ぶどう)の行を抜いた CSV(2行)で、同じ手順を試しました。ダイアログには「選択範囲では、最初のテーブルと 6 行中 4 行が一致しています」と出ました。

    マージのダイアログ。商品の表は2行(1001、1002)で、6行中4行が一致しますと出ている
    マージのダイアログ。商品の表は2行(1001、1002)で、6行中4行が一致しますと出ている

    展開すると、商品コード 1003 の2行(新宿、京都)は、商品名が null(空) になりました。売上の6行は、1行も消えませんでした(左外部のため)。

    展開後の表。1003 の行の商品名が null になっている。6行のまま
    展開後の表。1003 の行の商品名が null になっている。6行のまま

    VLOOKUP の「#N/A」にあたるものは、出ませんでした。null の行を、「該当なし」などに置き換える方法は、確かめていません。

  6. 商品の表に、同じ商品コードが2行あるとき

    商品の表に、1001 が2行ある CSV(1001「りんご」、1001「リンゴ(別名)」、1002、1003 の4行)で、同じ手順を試しました。ダイアログには「6 行中 6 行が一致しています」と出ました(売上の6行すべてに、相手がある、という意味と思われます)。

    マージのダイアログ。商品の表に1001が2行あり、6行中6行が一致しますと出ている
    マージのダイアログ。商品の表に1001が2行あり、6行中6行が一致しますと出ている

    展開すると、売上の行が増えました。6行が8行になり、商品コード 1001 の売上の行(渋谷、新宿)が、それぞれ2行ずつ(「りんご」と「リンゴ(別名)」)になりました。売上の合計を出すと、二重に数えてしまいます。

    展開後の表。商品コード1001の行が、商品名「りんご」と「リンゴ(別名)」で2行ずつになり、全部で8行
    展開後の表。商品コード1001の行が、商品名「りんご」と「リンゴ(別名)」で2行ずつになり、全部で8行

    マージする前に、商品の表で、商品コードが重複していないかを確かめるのが安全です。

答え合わせ

自分で採点する数字

商品名の列が足された表が6行のまま。商品コードが一致しない行は、商品名が null(空)になる。

  • Power Query エディターで売上のクエリを選び、「ホーム」の「クエリのマージ」。2つ目に products を選び、両方の「商品コード」を選んで OK。できた「products」列の展開ボタンで、「商品名」だけにチェックを入れる。
  • 結合の種類は、既定の「左外部」。products_missing では、ダイアログに「6 行中 4 行が一致」と出る。展開すると、1003 の2行は商品名が null になり、売上は6行のまま。
  • products_dup では、ダイアログに「6 行中 6 行が一致」と出るが、展開すると、1001 の行が2行ずつになり、6行が8行に増える。マージの前に、商品の表のコードに重複がないか確かめる。

この解説は、実機(Power BI Desktop 日本語版 2.159.883.0)で確かめた記事から、まとめています。確認していないことは、記事の最後に書いています。
元の記事を読む →

確認日: 2026-10-25。CSV はダミーのデータで、無料です。