このページは解答編です。
↓ネ
↓タ
↓バ
↓レ
↓防
↓止
答えと解説
設問はこちらでした。
P-038: 顧客データ(customer.csv)とレシート明細データ(receipt.csv)から、顧客ごとの売上金額合計を求め、10件表示せよ。ただし、売上実績がない顧客については売上金額を0として表示させること。また、顧客は性別コード(gender_cd)が女性(1)であるものを対象とし、非会員(顧客IDが”Z”から始まるもの)は除外すること。
※出力データの並びは、customer.csvのデータ順とする
解答ワークフローは以下のようになります。
今回は複数のデータを結合する問題です。レシート明細データ(receipt.csv)のデータを集計し、合計金額を計算した上で、顧客データ(customer.csv)と結合する問題です。このようなデータ結合の問題は、最初に結合してから集計等を行っていくのか、最初にそれぞれのデータを整理してから結合していくのか、というところで少し悩むかと思いますが、基本的にデータを減らす系の処理を優先しましょう。これにより重複データで悩まされたりということも減り、データ量も減らすことができるため、速度的にも高速化が図れます。
- 顧客データ(customer.csv)準備
- レシート明細データ(receipt.csv)準備
- データ結合
それぞれのデータについてみていきましょう。
1. 顧客データ(customer.csv)準備
まず、顧客データ(customer.csv)の順番をそのまま保ったまま出力するという条件があるので、最初にレコードIDツールで順序を保存します。単純にデータ入力ツールの後段にレコードIDツールを配置するだけです。
その後、除外条件があるのでフィルターツールを使います。条件としては、性別コード(gender_cd)が女性(1)かつ非会員(顧客IDが”Z”から始まるもの)ではないこと、ということになります。
以下のような計算式となります。
[gender_cd]="1" AND NOT(StartsWith([customer_id], "Z"))
これで、顧客データ(customer.csv)の準備は完了です。ここまでのワークフローは以下の通りです。
2. レシート明細データ(receipt.csv)準備
次に、レシート明細データ(receipt.csv)の準備を行っていきます。レシート明細データ(receipt.csv)は顧客ごとに売上金額を合計する、とのことなので、集計ツールを使っていきます。ただその前に、計算を行っているので、データ型の変更が必要です。
まずは、セレクトツールでamountをInt16に変更します。
その後、集計を行っていきます。設定は簡単で、customer_idでグループ化、そしてamountを合計します。
これでレシート明細データ(receipt.csv)の準備は完了です。ここまでのワークフローは以下の通りです。
3. 結合
1と2で作成したデータを結合していきましょう。以下のように接続します。
設定は以下の通りです。キーフィールドは「customer_id」となります。
ここで、J出力だけではなくL出力にもデータが出力されていることがわかります。L出力は売上がなかった顧客のデータになります。一方、J出力は、顧客データに売上データが付加されたデータとなります。
最終アウトプットには売り上げがなかった顧客のデータも必要になるので、この二つのデータストリームを結合する必要があります。
このような場合はユニオンツールを使います。
ユニオンツールは複数のデータストリームを縦に結合するものです。つまり、今回であれば以下のように接続します。
フィールド名で結合する場合は特にオプションを変える必要はなく、そのままのデフォルト設定で問題ありません。
念のため代表的なオプションについて簡単に解説します。
今回、L出力側には「amount」という項目がありません(J出力はL出力+amountとなります)。これをamountというフィールドを持つJ出力とユニオンで結合するとどうなるか。答えは、L出力から来たデータにはamountがないのでNullとなってしまいます。
「ただし、売上実績がない顧客については売上金額を0として表示させること。」という要求仕様があるためNullでは都合が悪いので、これを0におきかえる必要があります。
ここでは、データクレンジングツールを使ってNullデータを0に置き換えていきます。
データクレンジングツールは、すべてがNullとなるフィールドやレコードを削除したり、不要な文字を消去したりするツールです。この中にNullを0や空白に置換する機能があります。
フォーミュラツールでNullを0に置き換えることもできますが、計算式を書くのが面倒であればデータクレンジングツールは非常に楽なツールです。
これで基本的なデータは完成しています。あとは出力のためにデータを整えていきます。
まず、元のデータの並びを復元しましょう。レコードIDを昇順でソートしましょう。
あとは、サンプリングツールなどで10レコードのみ抽出し、セレクトツールで不要な項目を削除するだけです。
まとめ
今回も、結合ツールでデータの結合を行いました。データ量を減らすことができるような加工を行う場合はなるべく早い段階で実施しましょう。これによりデータ処理の高速化が図れます。
実際のデータ処理となるとこのような処理を行うケースは非常に多いかと思います。
コメント