2つのデータテーブルの列を指定して比較

2つのデータテーブルの全ての列ではなく、特定の列を指定して比較し、合致していたら比較した列+追加列を出力したいと考えています。

テーブルA
注文番号|品名|金額|消費税|総額

テーブルB
お客様番号|商品名|金額|消費税|税率

↓合致していたら

テーブルC
注文番号|品名|金額|消費税|総額|税率
↑テーブルAの項目とテーブルBの項目をくっつけて出したい。

※テーブルAとテーブルBで、少しカラム名は違いますが項目としては同じものが入っています。
注文番号⇔お客様番号
品名⇔商品名

For eachでAとBと繰り返して1カラムずつ項目をぶつけて…と考えましたがFor eachが冗長すぎてスマートではないので、LINQとかですんなり出来ないものかな、と試行錯誤してみましたが、LINQで列を指定しての比較構文は見かけないし、そもそもLINQ構文に変数を渡すことがうまく出来ず…。
LINQで比較出来たとしても出力したいテーブルCは項目がテーブルAとBのそれぞれだし…と悩んでいます。
LINQも勉強中であまり詳しくありません。

良い方法があればご教示下さい!

LINQと言うより、「データテーブルの結合」アクティビティで結合させ、出力列指定した方が簡単なような気がします。

2 Likes

回答ありがとうございます。

テーブルA・Bそれぞれの列を「=」でぶつけてみましたが、そうするとテーブルAとテーブルBの列が全てテーブルCに出力されてしまい望んだ結果になりませんでした。
また、合致しなかった行も分かるように出来れば理想なのですが…。
合致しなかった行は
[注文番号 … ]となってしまい分かりづらくなってしまっていました。

youtubeに解説動画を作ってくれているかたがいました。
これは、比較して合致するのを「削除する」なのですが
比較するところの説明がとってもわかりやすかったので貼ります。
https://youtu.be/VLkE1I2SfJ0

テーブルAの全件を出力するのでしたら、結合型をLeftに。
テーブルAもBも全件出力するのでしたら、Fullを指定してください。

その後、不要な列は「データ列を削除」で削除。。。

1 Like

すみません、デバッグ画面でテーブルCの中身を見たらNULL行が「 …」となってしまっていましたが、CSV出力したらちゃんと合致しなかった行の片方のテーブルの情報は出力されていました。
それでも冗長に列が出力されてしまうのを何とかしたいです。

不要な列は「データ列を削除」で削除という選択肢はダメですか?

ありがとうございます。

とりあえず列の削除より先に、出力したテーブルCと別のテーブルDを曖昧検索したいと考えています。

テーブルDの「商品」の先頭から4文字目以降10文字分をSubstringでキーワードとし、テーブルCの「品名」にあったら一致とする
更に
テーブルDの「金額」とテーブルCの「金額」が一致したら集計…
という流れを想定しています。
曖昧検索は結合アクティビティでは出来なさそうなのですが…。

テーブルDにテーブルCとの突合用のキーを「データ列を追加」アクティビティで用意し、
「繰り返し(行単位)」アクティビティで各行、テーブルDの「商品」の先頭から4文字目以降10文字分の列をその追加列に代入する。

その後テーブルCとテーブルDをInnerで突合し、その結果をテーブルEとする。

更に「データ テーブルをフィルタリング」でテーブルDの「金額」とテーブルCの「金額」が一致行のみを抽出し、集計…

パズルですね

返信が遅くなってしまい申し訳ございません。
色々とチャレンジして以下の手順で解決しました。
不要な列は、後でどれとどれをぶつけたか確認するためにも削らなくてもいいか、ということになりました。

<前の処理は省略>
①集計結果を入れるList配列を「代入」アクティビティで初期化
(list_a=New List(of String)
list_aには
分類|社名|集計したい項目1|項目2|…と入るイメージ。
※数字以外も入るのでString
また、上記Listを入れる集計テーブルも作成

②テーブルAとテーブルBを「データテーブルを結合」アクティビティで結合タイプ:FullでOutputテーブルに出力

③「コレクションに追加」アクティビティで①のListに分類を追加
(あれこれ色々処理があります)

④②のOutputテーブルに「データ列を追加」アクティビティでもう一つぶつけたいテーブルCが入る列を入れる

⑤「繰り返し(各行)」アクティビティで②のOutputテーブルを指定
(あれこれ処理のあとに)「代入」アクティビティで比較したい列(金額・品名)をそれぞれString型変数に代入
(あいまい検索したい品名はSubstringで3文字目以降を入れる(3文字目以降が取りたい)

⑥「テーブルをフィルタリング」アクティビティでテーブルCの項目を⑤の変数でフィルタしResultテーブルに入れる

⑦Resultテーブルに値があったら④で作った列に値を入れる
→Resultテーブルは都度初期化し繰り返す

<ここまででOutputテーブルに全部比較した結果が入る>
不一致なテーブルの項目は空になっている

⑧①で作ったlist_aに「コレクションを追加」アクティビティで会社ごとに集計をかけた結果を追加していき、「データ行を追加」アクティビティで同じく①で作っておいた集計テーブルにlist_aの結果をバツンと入れる

<以降の処理が続く…>

「コレクションを追加」の部分でLINQを使いました。
Outputテーブル.AsEnumerable.Where(Function(x) x(“項目1”).ToString=“”+String変数+“”).Sum(Function(x) Int32.Parse(x(“項目2”).ToString())).ToString
項目1のString変数にあてはまったものだけ、項目2の値(Stringで整数のみなのでInt32へParse)を合計しています。

途中の処理を割愛しているので分かりづらくて申し訳ありません。
LINQも変数の与え方が分かったので他の箇所にも使えそうです。
色々とヒントを与えて頂いてありがとうございました!

This topic was automatically closed 3 days after the last reply. New replies are no longer allowed.