ETLで、特定条件時に別の列の値
ベストアンサー
-
ご返信ありがとうございます!
それだったら、「Aが2の場合はB、それ以外はA」とBeast Modeを書くこととほとんど一緒かなぁと思ってしまいましたが、おかげさまでいいアイデアがひらめきました。
"値マッパ"&"列の値を設定"で「A」をコピーし新規列「C」を作り、”値マッパ"で「C」の条件不一致(A==2以外)の値を0へ上書き。"値マッパ"で「A」から条件(A==2)一致で0、それ以外はデフォルトで新規列「D」を作る。
A B C D
1 10 0 1
2 20 20 0
2 30 30 0
3 40 0 3
3 50 0 3
このあと、C+Dで新規列「E」を作る。
A B C D E
1 10 0 1 1
2 20 20 0 20
2 30 30 0 30
3 40 0 3 3
3 50 0 3 3
上記は数値の場合でしたが、文字列の場合は0の代わりに空文字列とし、CとDの文字列結合でEを作ると応用できそうです。
改めて見ると、分岐のロジックとあまり変わらないので、なぜ思いつかなかったんだろうという感じですが。。また、ご指摘通り条件が多いと嫌な点はありますが、分岐よりはよいです。
ご相談できてよかったです。ありがとうございました。
0
答え
-
こんにちは。
ETLで完結するのは難しいと思いますので、Beast ModeでCase関数やIFNULL関数を使う、
またはSQLで対処するしかないと思います。
SQLの方が対応しやすいですが、下記を参考にして頂ければBeast Modeでも解決すると思います。
DOMOヘルプ
1 -
ご提案ありがとうございます。
DataFlowの途中で一時的に算出したかったり、連続実行するDataFlowの1つで使う場面もありますので、Beast Modeでの対応はちょっと辛いなと思います。SQLでの対応も選択肢に入れます。
しかしこれまでETLで作っていることもありできればETLで完結したいと考えております。ETLでトリッキーな組み合わせ技でもいいので、いいアイデアがあれば引き続きよろしくお願いします。
0 -
返信ありがとうございます。
値マッパ ⇒ 列の値を設定 ⇒ 値マッパ という流れではいかがでしょうか。
①値マッパで対象項目の条件に仮一致するものを新規項目として仮に値をセット
②列の値を設定で「置き換えられる~」に①の項目を、「置き換える~」にセットしたい項目を一旦セット
③値マッパで置き換えたくないもの以外を「空文字」や「NULL」などでセット
上記では項目は2つに分かれますが、途中で演算等で使用するなら良いかと思います。
0 -
> ①値マッパで対象項目の条件に仮一致するものを新規項目として仮に値をセット
> ②列の値を設定で「置き換えられる~」に①の項目を、「置き換える~」にセットしたい項目を一旦セット
> ③値マッパで置き換えたくないもの以外を「空文字」や「NULL」などでセットすみませんが、わからない点が3つあります。
- ①の仮一致というものは何でしょうか?
- ②でいう「①の項目」というのは、①で作った新規項目ですか?それを上書きしてしまう??
- ③の「置き換えたくないもの以外」=「置き換えたいもの」だと思いますが、それを「NULL」にすると理由はなんでしょうか?
具体的な列で考えてみます。
列「A」に[1, 2, 3]のいずれかの整数が入っており、2の場合は列「B」の値に置換したいとします。
A B
1 10
2 20
2 30
3 40
3 50
↓(希望)
A B
1 10
20 20
30 30
3 40
3 50①で新規列「C」へ、条件一致した項目をセット。不一致時は(最初の値だと「A」そのものなので)999。
A B C
1 10 999
2 20 2
2 30 2
3 40 999
3 50 999
②でわからなくなります。0 -
>- ①の仮一致というものは何でしょうか?
①はダミーで項目を追加するイメージです。
A B C
1 10 999
2 20 999
2 30 999
3 40 999
3 50 999>- ②でいう「①の項目」というのは、①で作った新規項目ですか?それを上書きしてしまう??
②で①で作った新規項目へ置き換えたい項目を丸っとコピー
A B C
1 10 10
2 20 20
2 30 30
3 40 40
3 50 50>- ③の「置き換えたくないもの以外」=「置き換えたいもの」だと思いますが、それを「NULL」にすると理由はなんでしょうか?
NULLや空文字で判定し易くなるので。
③で条件一致以外を一律置き換えることによって、
B列とC列を使い分ければ良いかなと思いました。
※ただ条件が複数ある場合は使い辛いですね。。。
A B C
1 10 NULL
2 20 20
2 30 30
3 40 NULL
3 50 NULLBeast ModeやSQLでこんな感じで使えるかと思いました。
例)イメージは↓ですが、動作確認はしていません。。
CASE WHEN C ISNULL THEN A
WHEN C IS NOT NULL THEN B
ELSE A
END的外れな回答でしたら、スルーしてください。。
実際は①だけでも完結出来ますが、あえて「列の値を設定」を使用することで、
色々と使えるイメージが湧けばと思い投稿しました。
1 -
ご返信ありがとうございます!
それだったら、「Aが2の場合はB、それ以外はA」とBeast Modeを書くこととほとんど一緒かなぁと思ってしまいましたが、おかげさまでいいアイデアがひらめきました。
"値マッパ"&"列の値を設定"で「A」をコピーし新規列「C」を作り、”値マッパ"で「C」の条件不一致(A==2以外)の値を0へ上書き。"値マッパ"で「A」から条件(A==2)一致で0、それ以外はデフォルトで新規列「D」を作る。
A B C D
1 10 0 1
2 20 20 0
2 30 30 0
3 40 0 3
3 50 0 3
このあと、C+Dで新規列「E」を作る。
A B C D E
1 10 0 1 1
2 20 20 0 20
2 30 30 0 30
3 40 0 3 3
3 50 0 3 3
上記は数値の場合でしたが、文字列の場合は0の代わりに空文字列とし、CとDの文字列結合でEを作ると応用できそうです。
改めて見ると、分岐のロジックとあまり変わらないので、なぜ思いつかなかったんだろうという感じですが。。また、ご指摘通り条件が多いと嫌な点はありますが、分岐よりはよいです。
ご相談できてよかったです。ありがとうございました。
0