LoginSignup
11
5

More than 1 year has passed since last update.

DAX workout - 日付テーブルは特別扱い

Last updated at Posted at 2023-01-25

日付テーブルは特別なディメンジョンテーブルなのでそれなりの扱いを受けている。

日付テーブルに関する特別な動作

知らなくてもメジャーを記述できるけれど、フィルタ コンテキストの動作を理解しようとするとき不思議に思うことがあるでしょう。

DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[YearMonth],
    "Sales amount", [Sales amount],
    "Sales amount PM",
        CALCULATE(
            [Sales amount],
            PREVIOUSMONTH( Dates[Date] )
        )
)

この DAX クエリは YearMonth ごとにメジャー [Sales amount] と [Sales amount PM] を評価してテーブルとして結果を返す。

YearMonth Sales amount Sales amount PM
2020年1月 820,900
2020年2月 1,250,100 820,900
2020年3月 830,900 1,250,100
2020年4月 987,300 830,900
2020年5月 987,300 987,300
2020年6月 803,400 987,300
2020年7月 971,400 803,400
2020年8月 1,017,800 971,400
... ... 1,017,800

結果テーブルの "2020年3月" の行では メジャー [Sales amount] は 2020-03-01 ~ 2020-03-31 の日付の範囲で評価されているのはすぐさま理解できているはずだ。

Measure
Sales amount PM =
    CALCULATE(
        [Sales amount],
        PREVIOUSMONTH( Dates[Date] )
    )    

そして [Sales amount PM] は先月の [Salse amount] を得るメジャーで、CALCULATE 関数の <filter> パラメータには PREVIOUSMONTH 関数(タイム インテリジェンス関数)を利用している。"2020年3月" の行では、2020-02-01 ~ 2020-02-29 の日付だけが含まれる Dates[Date] 列 1列だけのテーブル フィルタである。
では、メジャー [Sales amount PM] の評価にも "2020年3月" の行ゆえに適用されるはずのフィルタ コンテキストの一部(Dates[Date] : 2020-03-01 ~ 2020-03-31)はどこ行ってしまったんだいと🤔 Dates[Date] が 2020-03-01 ~ 2020-03-31 であり 2020-02-01 ~ 2020-02-29 であるという日付は存在しないけれども、[Sales amount PM] の評価結果が BLANK にならないのはなぜなんだいと🤔

タイム インテリジェンス関数を利用していなくても同じ動作を確認できる。
累積を集計するため、CALCULATE 関数の <filter> パラメータには Dates[Date] <= MAX( Dates[Date] )

DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[YearMonth],
    "Sales amount", [Sales amount],
    "Sales amount RT",
        CALCULATE(
            [Sales amount],
            Dates[Date] <= MAX( Dates[Date] )
        )
)
DAX クエリ
EVALUATE
SUMMARIZECOLUMNS(
    Dates[Year],
    "Sales amount", [Sales amount],
    "Sales amount RT",
        CALCULATE(
            [Sales amount],
            Dates[Date] <= MAX( Dates[Date] )
        )
)

評価軸が Dates[YearMonth] / Dates[Year] と変わっても、引き続き累計された結果が得られる。

要はこういうこと。
ディメンジョンテーブルが日付テーブルとして認識されると自動で行われる所作。CALUCLATE 関数の動作を変更する関数のうち、REMOVEFILTER 関数が自動的に適用されている。だって、ほとんどの場合で必要になるでしょ。
日付テーブル以外のディメンジョンテーブルの場合はこうはならない。

Measure
Sales amount PM =
    CALCULATE(
        [Sales amount],
        PREVIOUSMONTH( Dates[Date] ),
        REMOVEFILTER( Dates )    // 自動的に適用されている状態
    )
Measure
Sales amount RT =
    CALCULATE(
        [Sales amount],
        Dates[Date] <= MAX( Dates[Date] ),
        REMOVEFILTER( Dates )    // 自動的に適用されている
    )

Syntax
REMOVEFILTERS([<table> | <column>[, <column>[, <column>[,…]]]])

Syntax
CALCULATE(<expression>[, <filter1> [, <filter2> [, …]]])

<filter> パラメータで使用できるのは次の式

  • Boolean filter expressions
  • Table filter expressions
  • Filter modification functions 👈これ

思ったこと🙄

フィルタ コンテキストの説明はできるのに日付テーブルに関する特別な動作について説明できないひと、意外と多い。

その他

11
5
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
11
5