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 の使用方法を改善することに専念しています。


Python における Self とは: 実際の例

Python における Self とは: 実際の例

Python における Self とは: 実際の例

RでRDSファイルを保存してロードする方法

RでRDSファイルを保存してロードする方法

R の .rds ファイルからオブジェクトを保存および読み込む方法を学習します。このブログでは、R から LuckyTemplates にオブジェクトをインポートする方法についても説明します。

最初の N 営業日の再考 – DAX コーディング言語ソリューション

最初の N 営業日の再考 – DAX コーディング言語ソリューション

この DAX コーディング言語チュートリアルでは、GENERATE 関数の使用方法とメジャー タイトルを動的に変更する方法を学びます。

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

LuckyTemplates のマルチスレッド動的ビジュアル手法を使用したインサイトのショーケース

このチュートリアルでは、マルチスレッド動的ビジュアル手法を使用して、レポート内の動的データ視覚化から洞察を作成する方法について説明します。

LuckyTemplates のフィルター コンテキストの概要

LuckyTemplates のフィルター コンテキストの概要

この記事では、フィルター コンテキストについて説明します。フィルター コンテキストは、LuckyTemplates ユーザーが最初に学習する必要がある主要なトピックの 1 つです。

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Online Service でアプリを使用する際の最良のヒント

LuckyTemplates Apps オンライン サービスが、さまざまなソースから生成されたさまざまなレポートや分析情報の管理にどのように役立つかを示したいと思います。

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

時間の経過に伴う利益率の変化を分析する – LuckyTemplates と DAX を使用した分析

LuckyTemplates でのメジャー分岐や DAX 数式の結合などの手法を使用して、利益率の変化を計算する方法を学びます。

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

DAX Studio でのデータ キャッシュのマテリアライゼーションのアイデア

このチュートリアルでは、データ キャッシュの具体化のアイデアと、それが結果を提供する際の DAX のパフォーマンスにどのように影響するかについて説明します。

LuckyTemplates を使用したビジネス レポート

LuckyTemplates を使用したビジネス レポート

これまで Excel を使用している場合は、ビジネス レポートのニーズに合わせて LuckyTemplates の使用を開始するのに最適な時期です。

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて

LuckyTemplates ゲートウェイとは何ですか? 知っておくべきことすべて