DAX Boot Camp#1に参加してまた少し前進できた件


※2021年6月21日追記※
こちらの記事に書いた「セット件数を集計する」について、(自分的には)もっといい方法を↓に書きましたので,
もしよろしければこちらもご参照ください。
【Power BI】過去の自分を超えろ!実績データからセットの件数をカウント2021バージョン

20200822 DAX Boot Camp#1に参加しました!!

去年の10月に開催された、DAX Boot Camp#0に引き続き、2020年8月22日、DAX Boot Camp#1に参加しました。
前回参加した時、モヤモヤが少し晴れて、ちょっぴり前に進めた感を記事にしておりますので、もしよろしければご参照ください。

DAX Boot Camp#0に参加してちょっぴりだけ前に進めたような気がしてきた件

前回は確か20人くらい参加していた記憶があるのですが、今回は募集自体が10名、参加者は主催者含め8名という少人数精鋭なまさにBoot Campでした。

今回の発表「DAXでテーブルを作ってみる!」

今回も全員発表で、わたしが準備したのは「DAXでテーブルを作ってみる!」というもの。
丁度直近で業務でやったところをまとめてみました。

【こんなことがしたい!】

●200ほどある商品のうち5アイテムで新しくセット販売を行ったが、どれくらいセットが売れているのか集計したい。

●ただし、実績データ(販売履歴)ではセットではなく、単品でのデータになっている。

●実績データの、販売日・営業所コード・店舗コード・顧客番号を使用して、顧客が同時に購入したアイテムを抽出可能。

実績データはこんな感じです。

【裏(Power Queryエディター)で】

これを、裏(Power Queryエディター)でやるとこんな感じ。

① 実績データをIDでグループ化して、同時に何アイテム購入したかカウント

② 実績データと5アイテムのマスタをマージ。5アイテムだけの実績に絞り込む
(ここはフィルターでもいいけど、マスタを使用した方がアイテムの変更とか追加とかが便利)

③ ②に①をマージして、5アイテム購入のIDだけに絞り込む。5アイテム購入したIDの、セットに該当するアイテムだけのテーブルができる。

④ ③をさらにIDでグループ化し、セットに該当するアイテムを何アイテム購入しているか集計。5アイテム購入したIDがセットを購入した顧客となる!

【いざDAXで!】

(データの準備:実績データとセット5項目のマスタを読み込んで、クエリを適用。)

① 実績データと5アイテムマスタをリレーション

② SUMMRIZE関数を使用して、購入商品数テーブルを作成

IDでグループ化して、ID数をカウントすると購入商品数が集計できる。

商品数 = ADDCOLUMNS(SUMMARIZE('Data',Data[ID]),"商品数",CALCULATE(COUNTROWS(Data)))

ちなみに、DAXで作成したテーブルはアイコンの色がうっすら水色になります。

ちなみにPart2、最初はこのDAX式をこんな風に書いていたのですが、

商品数 = SUMMARIZE('Data',Data[ID],"商品数",COUNT(Data[ID])) 

Power BI神かがたさんのこの記事を読んで、慌てて修正しましたw
SUMMARIZE 関数で集計列を追加しない理由

③ 実績データと商品数テーブルをリレーション

ここ忘れがちなので注意!

④ RELATED関数を使用して、実績データに、セットの5アイテムフラグ列と、購入商品数列を追加できる。
5set = RELATED('5Set'[商品名]) 
商品数 = RELATED('商品数'[商品数])

ExcelのVlookUPみたいな感じで使えます!

⑤ SUMMRIZECOLUMN関数を使用して、ID・購入アイテム・購入アイテム数の一覧を、5アイテム購入したID、セット該当アイテムのみに絞り込める。
5set集計1 =
SUMMARIZECOLUMNS (
    'Data'[ID],
    'Data'[5set],
    'Data'[商品数],
    FILTER ( 'Data', ISBLANK ( 'Data'[5set] ) = FALSE () ),
    FILTER ( 'Data', 'Data'[商品数] = 5 )
)

ちなみに、DAX式をこんな風に美しく整形するには、DAX Formatterがおススメです。
マルコさん曰く、「フォーマットされていないDAX式はDAX式じゃない!」そうですw)

⑥ 先ほどのテーブルを、SUMMRIZE関数を使用して、該当アイテムを何アイテム購入したかをカウントして集計できる。
5set集計2 =
ADDCOLUMNS (
    SUMMARIZE ( '5set集計1', '5set集計1'[ID] ),
    "5set", CALCULATE ( COUNT ( '5set集計1'[ID] ) )
)
⑦ 5アイテム購入したIDだけで絞り込むと、セット販売件数がでます!!!!(๑• ̀д•́ )✧+°ドヤッ

【さらに発展!】

5set集計1と2を一気に書けないものかと思いましたが・・・

(´·ω·`)ショボンヌ

またまたsuiさんが!

と、ここまでが発表の内容だったのですが、suiさんのお力添えで、さきほどの(´·ω·`)ショボンヌを実現することができました!

SUMMRIZE関数は使えないため、GROUPEBY関数を使用して、下記のように。
まずはvariableの中に仮想テーブルを作成して、それをGROUPEBY関数でグループ化して、件数をカウントしています。

5set集計sui =
VAR tempT =
    SUMMARIZECOLUMNS (
        'Data'[ID],
        'Data'[5set],
        'Data'[商品数],
        FILTER ( 'Data', ISBLANK ( 'Data'[5set] ) = FALSE () ),
        FILTER ( 'Data', 'Data'[商品数] = 5 )
    )
RETURN
    GROUPBY ( tempT, [ID], "テスト数", SUMX ( CURRENTGROUP (), 1 ) )

suiさん、ありがとうございました!

道のりは遠い、だけど千里の道も一歩から!

今回のBoot Campでも激しく感じたことは、こういうところに参加して発表するということがすごくプラスになるなということです。

参加して、他の参加者の発表で、自分が分かるところ、分からないところを知ることによって、自分がどのくらいのレベルなのか分かるし、前回は全然分からなかった部分が、今回なんとなく分かるという自分のスキルアップも実感できたし、刺激を受けることで、その刺激が業務のモチベーションにも繋がる。ただ仕事をこなすのではなくて、こういう風にできないかとか、こういう風にやってみようとか。

開催してくださったかがたさん、参加されたみなさん、本当にありがとうございました!

ありがたいことにBoot Campは継続して開催して頂けるということなので、是非参加してみるといいと思いますよ!