累積データ使用
日毎の累積データを扱う際、日ごとの増加分を算出したいと考えることがあります。
ただ、「Power BI Desktop」でその算出方法がわかりませんでした。
「DAX」を使えばできるのだろうと思ってましたが、何ぶんDAXの知識が不足しており手付かずでした。
ちょっとしたがきっかけでできたので、メモを残すことにしました。
使用したデータは内閣官房が「新型コロナウイルス感染症対策」サイトで提供しているオープンデータです。
下記のようなデータを使います。
DATEADD利用例
DATEADD:指定された間隔数だけ時間を前後にシフトした日付の列を含むテーブルを返します。
https://docs.microsoft.com/ja-jp/dax/dateadd-function-dax
●前日の値(メジャー)
「-1」で前日の累積値(culm)を返す。
階層型(年・四半期・月・日)の日付値を使う。
「[date].[Date]」は階層の中から「日」を使うという指定。
Pre_DATEADD =
CALCULATE(
SUM('前日差_メモ用'[culm]),
DATEADD('前日差_メモ用'[date].[Date], -1, DAY)
)
●前日との差(メジャー)
culm- Pre_DATEADD =
SUM('前日差_メモ用'[culm]) - [Pre_DATEADD]
PREVIOUSDAY利用例
PREVIOUSDAY:dates 列内の最初の日付の前日を表すすべての日付の列を含むテーブルを返します。
https://docs.microsoft.com/ja-jp/dax/previousday-function-dax
●前日の値(メジャー)
DATEADDデー指定したように「-1」は使わない。
Pre_PREVIOUSD =
CALCULATE(
SUM('前日差_メモ用'[culm]),
PREVIOUSDAY('前日差_メモ用'[date].[Date])
)
●前日との差(メジャー)
culm- Pre_PREVIOUSDAY =
SUM('前日差_メモ用'[culm]) - [Pre_PREVIOUSD]
結果は末尾に掲示します。
「列」の場合
「前日との差」は、表で考えると、行単位で計算するので(下記の表参照)、「メジャー」でなく「列」で算出できると考えました。
しかし、以下の式では想定通りの結果は得られませんでした。
●前日との差(列)
列_culm- Pre_DATEADD =
('前日差_メモ用'[culm]) - [Pre_DATEADD]
「[Pre_DATEADD」はメジャーなので、行単位ではなくテーブルを対象とし、指定した条件に沿う値を計算して返します。
メジャーであるPre_DATEADDで指定したフィルター条件(DATEADD('前日差_メモ用'[date].[Date], -1, DAY)は、数式列では有効にならなかったように思えます。
要因を理解しきれていないのですが、メジャーのロジックを列に割り当てるのは無理な感じはしました。
循環依存エラー対処1
なお、同様に「Pre_PREVIOUSD」の式を追加するとエラーが出ました。
●前日との差(列)
列_culm- Pre_PREVIOUSD =
('前日差_メモ用'[culm]) - [Pre_PREVIOUSD]
循環依存が検出されました: 前日差_メモ用[列_culm- Pre_PREVIOUSD], 前日差_メモ用[列_culm- Pre_DATEADD], 前日差_メモ用[列_culm- Pre_PREVIOUSD]。
「Pre_DATEADD」を使った式と同じスタイルなのに、なぜこのメッセージが出るのがわかりませんでした。
検索したところ、英語のサイトにたどり着きました。
この内容もあまり理解できなかったのですが、「CALCULATE関数を使った2つのメジャー関数がともに同じテーブル('前日差_メモ用'[culm])を参照していること。各メジャーを2つの数式列(列_culm- Pre_DATEADD、列_culm- Pre_PREVIOUSD)が使っていること」が関係しているようです。
上記サイトを参考に、以下の記述で対処しました。
●前日との差(列)
列_2culm- Pre_PREVIOUSD =
CALCULATE(SUM('前日差_メモ用'[culm]) - [Pre_PREVIOUSD],
ALLEXCEPT('前日差_メモ用', '前日差_メモ用'[date].[Date]))
エラーが出なくなっただけでなく、メジャーで使ったフィルター条件が適用できるようになりました。
循環依存エラー対処2
ALLEXCEPT:指定した列に適用されているフィルターを除く、テーブル内のすべてのコンテキスト フィルターを削除します。
https://docs.microsoft.com/ja-jp/dax/allexcept-function-dax
上述の通り、(たぶん)「ALLEXCEPT」を使うことで、「列」においても「メジャー」で使われているフィルターのみを有効にできるようです。
DATEADDを使っている数式列にも通用しました。
●前日との差(列)
列_2culm- Pre_DATEADD =
CALCULATE(SUM('前日差_メモ用'[culm]) - [Pre_DATEADD],
ALLEXCEPT('前日差_メモ用', '前日差_メモ用'[date].[Date]))
計算結果
集計初日の前日差は「その日の値-ゼロ」となります。
「Pre_DATEADD」を「空白でない」数値を表示するようにすれば、その値を表示しないようにできます。
了