LoginSignup
1
1

More than 1 year has passed since last update.

Power BI Desktopで前日差を求める<メモ>DATEADD、PREVIOUSDAY関数

Last updated at Posted at 2022-04-03

累積データ使用

日毎の累積データを扱う際、日ごとの増加分を算出したいと考えることがあります。
ただ、「Power BI Desktop」でその算出方法がわかりませんでした。
「DAX」を使えばできるのだろうと思ってましたが、何ぶんDAXの知識が不足しており手付かずでした。
ちょっとしたがきっかけでできたので、メモを残すことにしました。

使用したデータは内閣官房が「新型コロナウイルス感染症対策」サイトで提供しているオープンデータです。

下記のようなデータを使います。

image.png

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]))

計算結果

集計初日の前日差は「その日の値-ゼロ」となります。

image.png

「Pre_DATEADD」を「空白でない」数値を表示するようにすれば、その値を表示しないようにできます。

image.png

1
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
1