タグ別アーカイブ: カレンダーテーブル

Power Queryならではのカレンダーテーブル活用~経過営業日の算出

【M言語独自のリスト作成を通じて、経過営業日を自由自在に算出する】

エクセルのワークシートには経過営業日を計算してくれる便利な関数があります。Power Queryではその手の関数はないですが、独自のカレンダーテーブル活用により自由自在に計算方法をカスタマイズできます

上の画像のような連続した値を作成する方法は過去の記事でも紹介しています

今回の記事ではこういったPower Query・M言語独自のテクニックが詰まった内容になっています

ポイント

今回のポイントは関数などで一律に計算するのではなく、日付を並べたうえで計算を行います

上の画像のように該当する日付を並べて、曜日に変換し「0,1」を並べます

そして、最後に「0,1」の列を合計します

この合計が経過営業日です

ですので、後から条件式の追加などが容易です

上の画像では祝日が考慮されていませんが、祝日の考慮はもちろん、その他の条件の考慮も容易に行えます

カレンダーテーブルの作成

カレンダーテーブルの作成はリスト作成⇒テーブルに変換の流れで作成します

「..」を使用すると連続した値のリストが作成できます

この仕組みを利用して、他クエリからまずは連続した日付のリストを作成します

他のクエリとは下の画像のような2つの日付を記したクエリになります

期間_単数

こちらのクエリの各列の1行目を参照して、空のクエリでリストを作成します

*{0}で1行目を参照します

ここではNumber.From関数で一旦数値に変換しています

= {Number.From(期間単数[期間A]{0})..Number.From(期間単数[期間B]{0})}

連続した数値を作成した後は、テーブルに変換します

後は日付形式に変換を行います

曜日への変換

曜日への変換は「Date.DayOfWeekName関数」を使用します

曜日だけではなく、祝日も考慮が必要です

祝日については別途テーブルを作成しておく必要があります

こちらは作成した空のクエリのマージします

そして、曜日との集約を「条件列」で行います

これで「0,.1」を並べる列を作成する準備ができました

0,1列の作成及び合計

0,1を並べる列はカスタム列作成画面でif関数を使用して作成します

これで0,1が並ぶ列/Digitを作成することができました

尚、上記の式ですと「起算日の曜日」が休日でない場合には自動的に計算に含まれています

それでは本題に戻りますが、最後にこちらのDigit列を対象にして、変換タブから合計処理を行います

これで経過営業日を算出できました

ちなみに祝日クエリをマージした時に、日付の並びが変わってしまいますので、並び替えを行っておくと計算過程が分かりやすいです

計算方法の調整

起算日には曜日・祝日に関わらず計算に入れる(0を立てる)、もしくは計算に入れないなどの調整にはインデックス列を使用します

上記の画像のように、起算日の行になるのは「インデックス列」の1になります

ですので、if式をインデックスが1の時には値が0(もしくは1)になるように修正します

逆に計算の終点の日を曜日・祝日に関わらずに計算に入れる場合にはLis.Max関数を使用します

複数行計算する場合

複数行にて計算する場合には、カスタム関数を使用します

前述のクエリの詳細エディタを開き、コードに記号を埋め込んで関数化します

={Number.From(myDate[起算日A]{0})..Number.From(myDate[起算日B]{0})}

⇒{Number.From(A)..Number.From(B)},

上の画像のAとBの記号が、下の画像の各列と対応します

そして、記号を埋め込んで完了ボタンを押すと、関数は完成です

こちらの関数を複数行あるクエリで呼び出します

この際、前述の記号に各該当列を割り当てます

これで、各行に関数が割り当てられます

後は関数で作成した列を展開して終了です

<まとめ>

今回は経過営業日をPower Query独自のカレンダーテーブルにより算出する方法を解説しました

もしかしたら、上記の内容で「この画像の起算日の計算式は?」という内容もあるかもしれませんが、ご容赦頂ければと思います

今回の方法ですと、ワークシート関数で一律に計算するより、分かりやすく、カスタマイズしやすいです

ぜひ、手を動かしながら試してみて頂きたいと存じます!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

カレンダーテーブルの活用により、数字を時系列の軸で自由に集計するツアー

今回のシリーズ記事では、カレンダーテーブルを使用してデータを「前年データ」や「累計」などの時系列で簡単に整理し直す技術を解説したいと思います

カレンダーテーブルとは、売上データなどの日付が入ったデータをカレンダーのそれぞれの日付に割り当てて整理するためのテーブルです

カレンダーテーブル

このカレンダーテーブルが活用できるようになると、今までエクセルのワークシートで手動での転記処理に頼っていた「時系列でのデータの整理」が簡単にできるようになります

カレンダーテーブルの作成・準備

作成

ここまでの解説だと「カレンダーテーブルとはなんなのか?」が具体的にはよくわからないと思います

シンプルに言えば、まさにカレンダーのような連続した日付列を起点として作成されたデータテーブルです

この連続した日付データに年や月などを紐づけておき、売上データなどを時系列で括りなおせるようにします

リレーション

作成したカレンダーテーブルは、他テーブルとリレーション(紐づけ)を行って使用します

このリレーションを適切に行わないと、カレンダーテーブルを活用できません

会計年度の調整

日本の企業は大抵が3月決算です

ですから、1月~3月のデータは実際の年より前の年で会計年度が割り当てられます

この会計年度の調整を事前にカレンダーテーブルで行っておきます

メジャーの作成(前年比、累計など)

前年比や累計など、作成したカレンダーテーブルを活用して作成する数字はメジャーで作成します

エクセルを使用してきた感覚の延長だと、このメジャーというのはなかなか理解しがたいものです

何故なら、テーブルの列にメジャーで作成した数字はでてこないからです

これはメジャーで作成する前年比などの数字は穴埋め問題みたいなものだからです

穴埋め問題の答えは、あくまで前後の数字が決まってから答えが決まります

例えば、前年比ならば集計対象が2022年6月ということが決まってから2021年6月に対する前年比を算出することが決まります

このメジャーが穴埋め問題である点に慣れれば、後はDAXというPower BI(Power Pivot)独自の関数を使用して計算していくだけです

このDAXはワークシート関数と同じ感覚で使用できますが、文法が若干違うので注意が必要です

<まとめ>

数字を見ると時のツボは時系列で比較することです

私もこの辺の時系列のデータ整理はさんざん苦労しました

エクセルではどんなに頑張っても手動処理が入るからです

しかも、かなり気を遣うので疲れます

Power BIのカレンダーテーブルを活用して時系列でデータを自動整理する仕組みは、まさにPower BIの醍醐味といっても過言ではありません

ぜひ次回からの回でしっかりカレンダーテーブルを活用する技術を身につけましょう!

2回目:カレンダーテーブルを実際に作成する~カレンダーテーブルを活用するツアー~

3回目:カレンダーテーブルを実用的に調整する~カレンダーテーブルを活用するツアー~

4回目:前年の値や累計を使う~カレンダーテーブルを活用するツアー~

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

カレンダーテーブルを実際に作成する~カレンダーテーブルを活用するツアー~

今回は前回の内容に従って、カレンダーテーブルを実際に作成してみましょう!

カレンダーテーブルを作成する時にDAX(エクセルのワークシート関数のようなもの)も使用します

元のデータはこちらの3つのテーブルになります

ですので当初のリレーションはこのようになっています

こちらにカレンダーテーブルを組み込む形になります

新しいテーブルの作成

カレンダーテーブルの作成は最初、こちらをクリックするところから始まります

すると数式が入力できるようになります

左辺をCalendarとし、右辺にCaを入力すると、入力するDAXの候補がでてきます

こちらの候補から「CALENDAR」をTabキーで選択してください

CALENDAR()の〇括弧:()の中には、連続した日付を作成する際の開始日終了日を指定します

YEAR/年とMONTH/月の列の作成

連続した日付データができたので、今度は日付データを使用してYEARとMONTHの列を作成します

上の画像の「新しい列」をクリック後、まずはYEARの列を作成します

YEARの列を作成するにはDAX「YEAR」を指定します

その際に、コツが一つあります

丸括弧:()の中でを指定すると()中に入れる列名の候補が選択できます

今回は’Calendar[Date]の列を指定して、日付列(2021/04/01⇒2021)を年に変換して列を作成します

今、DAX:YEARをして列を作成しましたが、通常のエクセルのワークシート関数を使用した時との違いは、セルではなく列単位で関数を使用しているという点です

MONTHの列もYEARの列と同様に作成します

会計年度の調整

前回も触れましたが、3月決算の場合には会計年度を調整する必要があります

例えば、2022年1月の場合には、上記のYEAR関数で作成した列には「2022」と表示されます

ただ実際には会計年度は2022から1を引いた「2021」になります

ですので、MONTH列をもとにしてIF関数により1月~3月の会計年度を調整します

if(MONTH([Date])<4,YEAR([Date])-1,YEAR([Date]))

ちなみに四半期の列を作成するQUARTER関数を使用すると次のようになります

4月が第2QUARTERとなります

これは12月決算をもとにしてDAXが作成されているからです

この場合も3月決算にあわせてIF関数を使用します

IF(MONTH([Date])<4,4,if(MONTH([Date])<7,1,IF(MONTH([Date])<10,2,3))

リレーションシップの作成

カレンダーテーブルをひとまず、形にはしました

これだけでは、カレンダーテーブルを活用することはできません

他のテーブルとリレーションシップを作成・紐づけを行う必要があります

リレーションシップを作成するには、以下の画面で操作が必要です

こちらの画面で売上データの「日付データ」とカレンダーテーブルの「Date」を紐づけます

操作はいたって簡単です

該当する列の上でドラックをするだけです

これで下の画像のようなリレーション(売上データ:多⇒Calendar:1)が完成します

これで売上データとカレンダーテーブルを一緒に活用できるようになりました

では、レポート画面で「マトリックス」を作成してみましょう

マトリックスの行にカレンダーテーブルの「YEAR」を配置します

YEARの配置もドラックで行います

そしてマトリックスの値に売上データの売上金額を配置します

すると上記の画像のように「年」毎に売上金額の合計が算出されています

これはカレンダーテーブルと「多:1」の紐づけが行われているからです

では試しに、リレーションを消してみます

すると、以下のように2021年も2022年も同じ金額になってしまいます

これは、年ごとの多:1の紐づけが行われないまま、単純に売上金額の合計が算出されるからです

<まとめ>

今回はカレンダーテーブル自体を作成しました

エクセルと違い、テーブルも列も一から作る点がとても斬新だと思います

ただ、これだけだとまだ実用的なカレンダーテーブルとはいえません

次回、調整を加えていきたいと思います

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

Power Queryならではのタイムテーブル活用方法

Power BIやPower Pivotではタイムテーブルの活用が欠かせません。ただPower Queryでもタイムターブルの作成と活用を行うことができます。今回の記事ではPower Queryならではのタイムテーブルの活用方法を紹介します

タイムテーブルを活用することで、集計作業で必ず必要になる「前期比での対比」「四半期単位への変換」などを簡単に行えるようになります

ボタンのワンクリック、もしくはたった1行の簡単なコード入力だけで、連続した日付が網羅されたカレンダーテーブルを作成できるのは本当に便利です

Power Queryでも空のクエリから1行のコードを入力するだけで、全く同じようにカレンダーテーブルを作成できます

今回は作成したカレンダーテーブルを活用して、担当者のスケジュール表を作成してみましょう

ポイント

別テーブル作成

カレンダーテーブルを作成するのはもちろんですが、カレンダーテーブルとは別に担当者テーブルを作成してマージします

担当者テーブルを作成する時には、マージする際のキーにする列「」を作成するのもポイントです

もちろんカレンダーテーブル側にも同じ内容のキー列を準備しておく必要があります

ピボット

カレンダーテーブルは当然、下の画像のように縦方向で作成されます

こちらはピボット処理によりに方向を変えます

上の画像の各日付の列には空欄が入力されています

この点については詳細を後述します

カレンダーテーブルの作成

Power Queryのカレンダーテーブルは、空のクエリから波括弧:{}と複数のM関数を組み合わせて作成します

・波括弧:{}⇒..と組み合わせて連続データを作成

#date関数⇒日付データを作成

Number.From⇒数字データを作成

上記の3つを組み合わせてカレンダーリストを作成します

= {Number.From(#date(2022,4,1))..Number.From(#date(2022,4,30))}

リストを作成したらテーブルに変換します

更に日付形式に変換します

担当者クエリの作成

こちらはポイントで前述したように、キー列を設定したうえで作成します

担当者の人数が少なければ、Power Queryエディタ上からの入力も可能です

カレンダーテーブルのピボット処理

前述のカレンダーテーブルには、ピボット処理(縦⇒横)の前に2つの列を追加しておきます

キー列の追加

カスタム列・作成画面にて担当者クエリで作成したキー列と同じ内容の列を作成します

空欄列の追加

こちらの追加処理はとても重要な処理です

この空欄列は、連続日付データをピボット()に並べ替えた際に表の中身となり、スケジュール表の入力欄になるものです

空欄の作成はキー列と同じくカスタム列・作成画面で行います

ピボット処理

ピボット処理は変換タブから行います

上記の「列のピボット」をクリックする前に、連続日付データがある列をカーソルで選択しておきます

「列のピボット」をクリックしたらダイアログボックスが表示されます

こちらで2つ指定します

・値列(表の中身)⇒空欄列

・詳細設定オプション⇒値の集計関数⇒集計しない

上記のピボット処理により、下の画像のような形になります

クエリのマージ

前述の2つのクエリをマージすると、担当者別スケジュール表が完成します

ただキーの列は削除しておきましょう

<まとめ>

今回はPower Queryならではのカレンダーテーブルの活用方法を解説しました

カレンダーテーブルは時系列のデータを集計する上でとても便利なものです

本来はPower Queryではカレンダーテーブルの機能はありませんが、M言語の簡単な仕組みを組み合わせれば簡単に作成することができます({}、..、#date、Number.From)

今回紹介した活用方法は「担当者スケジュール表」でしたが、他にも活用方法があるはずです

ぜひ、自分なりの活用方法を開発してみてください!

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ

DAX使用時に罠に陥り易いところ~Power Pivot、Power BI~

今回の記事では、DAXを使用していて罠に陥り易いところを解説します

DAXは登場してまだ日が浅く、あまり事例が溜まっていないこともあるので、まだDAXを始めたばかりの方は

「あれ、なんでうまくいかないんだろう・・・」

ということも多いと思います

特にリレーション関連では不可解に感じることもあるかと思います

この記事では、自身の経験も含めて「思わぬところでハマった」箇所を解説していきます

ポイントは次の5つとなります

・データ変更時の更新処理

・DAX式の()の数の確認

・事業年度の月次の並び

・1対多の関係性の確認

・Power Query内のデータ形式の確認

更新漏れ

これは物凄い単純なのですが、急いでいる時などにハマる方もいらっしゃると思いますので紹介します

例えば、上の画像のように空欄があるデータがあり、後から元データの空欄を埋めたとします(✕✕物流

ところが「Power Pivot for Excel」の画面には反映していないので「なぜだ?」というケースがありました

元のデータを変えた場合には下の画像の黄色の箇所「最新の情報に更新」にて更新処理を必ず行いましょう。すぐに元データの変更が反映されます

【)】の抜け

意外とエラーの原因が分からないのが左括弧/に対応する右括弧/)の抜けです

特に変数を使うケースなどは分かりにくいです

赤字の波線が出たら、落ち着いて「赤字の波線」がではじめたところのの組み合わせを観察しましょう

下の画像では黄色の箇所でがぬけています

事業年度の月次表示

日本では多くの事業年度は4月から翌年の3月までです

その際、IF式を使って事業年度を調整する方も多いと思います

ところが、月の表示を組み合わせると下の画像のように「1~3月」が思うような位置に並びません

上の画像の場合で言えば、本来は2021年度は4月から始まり、1~3月は最後に回って欲しいのです

この場合は、事業月を「yyyy年MM月」を表示する月を作成した方が早いです

下の画像では「FORMAT」を使用して表示を「yyyy年MM月」に変えています

これで月の表示も狙い通りになります

リレーションが効いていない

DAXを使う際に、厄介なことの一つがリレーションが効いてない時の対処です

リレーションが効いていないと、全て同じ数字になるなどの状態になります

この場合は下の画像のようにアラームは出ています

この様なときは丁寧にリレーションの状況を確認して、の漏れを見つけましょう

リレーションの線が破線になるケース

しっかり抜け漏れなくリレーションを作成しても、リレーションの線が破線になり、リレーションが有効にならないケースがあります

中にはうっかり「非アクティブ化」をクリックしてしまい、波線になっていることもあるかと思います

これはDAXを始めた頃は解決方法が分かりにくいかと思います

後、原因が分かりにくいのが次の画像のケースです

上の画像では「▶」の向きがになっており、本来「1」は予定表の方についているべきなのです

この矢印の逆向きの話しについては「1対多」の関係を考慮する必要があります

特に管理画面ではなく、2つのテーブル間でクリック処理によりリレーションを作成する場合に注意が必要です

ちなみに上の画像内のは「多」という意味です

下の画像は注文データテーブルとカレンダーテーブル(グレーの線)の組み合わせになっています

カレンダーテーブルには「2019/04/02」はつしかありません

一方、注文データテーブルには「2019/04/02」が複数存在します

ですのでカレンダーテーブルの「2019/04/02」を「2019/04/02」が多数存在する注文データテーブルの方向に紐づける必要があります

上記の説明が、少し分かりにくいと感じた方は次のケースで考えてみてください

カレンダーテーブルに多数「2019/04/02」が存在し、紐づけようがなくなってしまう場合です

上の画像のように本来は1になっているべきカレンダーテーブル側に「2019/04/02」が複数ある場合、カレンダーテーブル内のABのどちらを注文テーブル側の「2019/04/02」と紐づけたらいいか分からないですよね

つまり、紐づける方向は多ではなくからになるということです

では、具体的にリレーションの線が破線になっているのを修正したいと思います

1になるカレンダーテーブルの予定表から注文データに線を引っ張ります

こうすることで正しいリレーションを作成することができます

正しくリレーションが作成できている場合にはリレーション管理画面は次のようになっています

1の方がにありますので、この点もご注意ください

リレーションの方向が一致しているのにリレーションが有効にならないケース

Power Queryで作成したクエリをデータモデルに追加した場合には、クエリ内のデータ形式が一致せずに2つのテーブルが紐付かず、リレーションが効かないケースがあります

このケースが一番、罠にハマるパターンの中で原因に気づけないケースです

但し、データ形式を変えればあっさりリレーションは有効になります

これはAccessと違い、テーブルを構築する際にPower PivotやPower Queryの場合にはデータ形式を設定する必要がないことと深く関係があります

下の画像は、Accessの画面ですがテーブルを作成する際の画面です

こちらは、Power Queryエディタの画面です

Power Queryではデータ形式は変更できますが、基本的には自動設定です

特に日付データの場合は型式が「テキスト」でも「日付」でも見た目が一緒なので、既存のデータモデルとの型式の違いに気づきにくいです

ですので、特にカレンダーテーブルとのリレーションを作成する時にはPower Query側の日付形式にはご注意ください

<まとめ>

今回はPower PivotやPower BIでDAXを使用する時にハマりやすいものを、小さいものから大きい物まで幅広く紹介しました

ポイントをまとめると次のようになります

・データ変更時の更新処理

・DAX式の()の数の確認

・事業年度の月次の並び

・1対多の関係性の確認

・Power Query内のデータ形式の確認

ぜひ上の5つを意識しながら、DAXを活用してみてください

にほんブログ村 資格ブログ ビジネススキルへ

にほんブログ村

にほんブログ村 IT技術ブログ VBAへ