DAX の最適化: 隠された DAX トラップを見つける場所

DAX の最適化: 隠された DAX トラップを見つける場所

今日は私が隠れた DAX トラップと呼ぶものに焦点を当てたいと思います。このような状況に遭遇すると、DAX は正しく見えるはずなのに、うまく機能しないため、正気を失ったように感じるでしょう。この問題が発生した場合とその対処法について説明し、その過程で一般的な DAX 最適化のベスト プラクティスについても説明します。このチュートリアルの完全なビデオは、このブログの下部でご覧いただけます。

まず、ここで何を扱っているかを見てみましょう。インターネット ムービー データベースには約 10 年分のデータがあります。ファクト テーブルは非常にシンプルで、評価データ、予算データ、総データが含まれています。

今日は世界の総売上高を見ていきます。

DAX の最適化: 隠された DAX トラップを見つける場所

拡張日付テーブルもあります。これは、日付テーブルとファクト テーブルに基づくタイム インテリジェンス分析になります。

DAX の最適化: 隠された DAX トラップを見つける場所

目次

全世界の年間総総売上高

私たちは本当に一般的でシンプルなことをしたいと考えています。世界総総売上高は非常に単純な合計値であり、パーセンテージに変換したいと考えています。

DAX の最適化: 隠された DAX トラップを見つける場所

これを行うには、分子 (全世界総計のメジャー) と分母 (全世界総計のメジャー、ただし年フィルターからコンテキストは削除) を取得します。

DAX の最適化: 隠された DAX トラップを見つける場所

コードを読むときに直感的だと思うのでを使用しましたが、 使用したい場合は、それも同様に機能します。分子を分母で割るだけで結果が得られます。

結果のメジャーを取得してテーブルにドロップすると、期待どおりの動作をすることがわかります。最下位では 100% が得られ、年が個々のパーセンテージに変換されます。これまでのところ順調で、まだ問題は発生していません。

DAX の最適化: 隠された DAX トラップを見つける場所

四半期ごとの全世界総売上高

同様の状況を四半期ごとに見てみましょう。この指標は、夏の映画シーズンの興行収入が年初とオスカーシーズンにつながる年末にかけて異なるという仮説があるため、役立つ可能性があります。

繰り返しますが、REMOVEFILTERS 関数を使用して、年ではなく四半期の数値に対してまったく同じ測定を行います。

DAX の最適化: 隠された DAX トラップを見つける場所

そして、先ほど作成したメジャーをテーブルにドロップすると、期待どおりの結果が得られます。

DAX の最適化: 隠された DAX トラップを見つける場所

全世界の月間および年間総売上高

3 番目のケースを見てみましょう。これは非常に一般的ですが、月と年ごとに見ていきたいと思います。

DAX の最適化: 隠された DAX トラップを見つける場所

もう一度、前と同じメジャーを使用します。ただし、今回は月と年のフィルタを削除します。

DAX の最適化: 隠された DAX トラップを見つける場所

それをテーブルに追加しましょう。突然、機能しなくなりました。

DAX の最適化: 隠された DAX トラップを見つける場所

何がうまくいっていないのかを知ることができます。Worldwide Gross 測定が機能していることはわかっています。つまり、分子は問題ありませんが、分母は問題があるということです。前の各ケースでは、REMOVEFILTERS 関数によってフィルターが適切に削除されましたが、ここでは明らかに削除されていません。

ここで結果として返したものを変更することで、これを実際にテストできます。

DAX の最適化: 隠された DAX トラップを見つける場所

Result の代わりに Denominator を使用しましょう。これはパーセンテージでフォーマットされるので、少しおかしく見えることに注意してください。

DAX の最適化: 隠された DAX トラップを見つける場所

分母としてどの行でも同じ数値が得られるはずですが、そうではありません。

DAX の最適化: 隠された DAX トラップを見つける場所

月と年のフィルターが削除されていないことがわかり、月と年がテキストに含まれているためであると考えられます。

DAX の最適化: 隠された DAX トラップを見つける場所

ただし、前の四半期のものもテキストで表現されていたため、単純にテキストだからというわけではありません。整理するだけで十分です。並べ替えずにフィールドをドロップすると、アルファベット順に並べ替えられます。

拡張日付テーブルで、 Month & Yearというフィールドを見てみましょう。[並べ替え] 列でこれを見てみると、興味深いことがわかります。

この列が、Monthnyear という数値によって並べ替えられていることがわかります。ある列を別の列で並べ替えると、その並べ替え列は実際にはフィルター コンテキストの一部になります。これがこの計算を狂わせている原因です。

DAX の最適化: 隠された DAX トラップを見つける場所

メジャーに戻って、種類として使用している月と年のコンテキストを削除しましょう。

DAX の最適化: 隠された DAX トラップを見つける場所

これで、適切なパーセンテージとして計算された月と年を正確に取得できるようになりました。

DAX の最適化: 隠された DAX トラップを見つける場所

フィルター コンテキストを削除する場合、ソート時にこれを���うには 2 つのフィールドが必要になります。ここで 2 つのフィールドを作成する代わりに、なぜ日付テーブル全体のフィルターを削除できないのかと疑問に思われるかもしれません。

答えは、可能です。これらの列はそれぞれ日付テーブルの一部であるため、これまでに説明した 3 つの例では機能します。そのテーブル上のすべてのフィルター コンテキストを削除すると、3 つのケースすべてで機能しますが、これは実際には悪い考えです。

一般的な DAX 最適化原則として、必要な結果を得るために必要なだけのフィルター コンテキストを削除する必要があります。

ほとんどの場合、これを表形式で提示することはありません。これを行列として表示しますが、同じ列に 2 つの異なる粒度があるため、より複雑なメジャーが必要になります。この措置は複雑そうに見えますが、実際はそうではありません。

DAX の最適化: 隠された DAX トラップを見つける場所

これは、私たちがすでに行ってきたことの単なる拡張です。この DAX 最適化計算の最初の部分では、さまざまな粒度の分母が示されています。月、年、およびテーブル全体のフィルター コンテキストを削除します。

DAX の最適化: 隠された DAX トラップを見つける場所

計算の 2 番目の部分では、SWITCH TRUE を使用しました。この関数では、最も具体的なものから最も具体的でないものに進む必要があります。月は最も厳密で具体的な範囲なので、ここから始めます。特定した 2 つのフィールドを使用してコンテキストを削除する必要があります。

DAX の最適化: 隠された DAX トラップを見つける場所

年のスコープについては、年のコンテキストを削除し、テーブル全体のコンテキストを削除する必要があります。

DAX の最適化: 隠された DAX トラップを見つける場所

日付テーブル全体のコンテキストを取得して削除するとどうなるかを見てみましょう。3 つのケースすべてに対して、日付テーブル全体のコンテキストを削除する別のメジャーを使用します。

DAX の最適化: 隠された DAX トラップを見つける場所

この措置がコンテキストを過剰に削除していることがわかります。その年に対する各月の寄与度を計算するのではなく、データセット全体に対するその月の寄与度を計算します。これは私たちが望んでいることではありません。なぜなら、テーブル全体からコンテキストを削除することは、メスが必要な場合には鈍器にすぎないからです。

結論

マトリックスがあり、どのコンテキストを削除するかを慎重に制御する必要がある場合が多くあります。テーブル全体のコンテキストを単に削除すると、この種の問題が発生します。

この状況が発生したとき (必ずいつかは発生します)、この DAX 最適化の投稿で説明した隠れた罠であることを認識し、同じイライラをせずに回避できることを願っています。最初にこの問題を見たとき、DAX が適切に動作しない理由がわかりませんでした。

この特定のチュートリアルで取り上げた DAX 最適化トピックを気に入っていただけた場合は、LuckyTemplates TV チャンネルに登録してください。私自身やさまざまなコンテンツ作成者からの膨大な量のコンテンツが常に公開されており、全員が LuckyTemplates と Power Platform の使用方法を改善することに専念しています。


Power Automate の文字列関数: Substring と IndexOf

Power Automate の文字列関数: Substring と IndexOf

Microsoft フローで使用できる 2 つの複雑な Power Automate String 関数、substring 関数とindexOf 関数を簡単に学習します。

LuckyTemplates でビジュアル ツールチップを作成する

LuckyTemplates でビジュアル ツールチップを作成する

LuckyTemplates ツールチップを使用すると、より多くの情報を 1 つのレポート ページに圧縮できます。効果的な視覚化の手法を学ぶことができます。

Power Automate で HTTP 要求を行う

Power Automate で HTTP 要求を行う

Power Automate で HTTP 要求を作成し、データを受信する方法を学んでいます。

LuckyTemplates で日付テーブルを作成する方法

LuckyTemplates で日付テーブルを作成する方法

LuckyTemplates で簡単に日付テーブルを作成する方法について学びましょう。データの分析と視覚化のための効果的なツールとして活用できます。

2 つの方法による SharePoint 列の検証

2 つの方法による SharePoint 列の検証

SharePoint 列の検証の数式を使用して、ユーザーからの入力を制限および検証する方法を学びます。

SharePoint リストを Excel または CSV ファイルにエクスポート

SharePoint リストを Excel または CSV ファイルにエクスポート

SharePoint リストを Excel ファイルおよび CSV ファイルにエクスポートする方法を学び、さまざまな状況に最適なエクスポート方法を決定できるようにします。

Power Automate のオンプレミス データ ゲートウェイ

Power Automate のオンプレミス データ ゲートウェイ

ユーザーがコンピューターから離れているときに、オンプレミス データ ゲートウェイを使用して Power Automate がデスクトップ アプリケーションにアクセスできるようにする方法を説明します。

DAX 数式での LASTNONBLANK の使用

DAX 数式での LASTNONBLANK の使用

DAX 数式で LASTNONBLANK 関数を使用して、データ分析の深い洞察を得る方法を学びます。

CROSSJOIN 関数の使用方法 – LuckyTemplates および DAX チュートリアル

CROSSJOIN 関数の使用方法 – LuckyTemplates および DAX チュートリアル

LuckyTemplates で予算分析とレポートを実行しながら、CROSSJOIN 関数を使用して 2 つのデータ テーブルをバインドする方法を学びます。

TREATAS 関数を使用して LuckyTemplates で仮想リレーションシップを作成する

TREATAS 関数を使用して LuckyTemplates で仮想リレーションシップを作成する

このチュートリアルでは、LuckyTemplates TREATAS を使用して数式内に仮想リレーションシップを作成する方法を説明します。