CALCULATE DAX 函數:問題與解決方案

CALCULATE DAX 函數:問題與解決方案

在今天的博客中,我們將探討為什麼您不應該使用 DAX 函數來獲取每個類別的平均值,並提供一些替代解決方案來獲得您想要的相同結果。您可以在本博客底部觀看本教程的完整視頻。

在 DAX 中獲取每個類別的平均值非常複雜。通過使用 CALCULATE 函數來解決這些計算,新的 DAX 用戶可能會發現 DAX 代碼比應有的更難理解。好消息是這個問題有更簡單的解決方案。 

目錄

CALCULATE DAX函數概述

幾個月前,我在上介紹了LuckyTemplates。它被稱為 DAX Counterculture,我在其中提供了一些關於 DAX 的替代觀點。 

其中一個主要問題與 CALCULATE 函數的使用有關。我談到了為什麼您不應該使用 CALCULATE,特別是如果您是 DAX 的新手。 

CALCULATE 是一個很難理解和使用的函數。它對您的數據模型做出某些假設,可能會給您帶來很多麻煩。 

我還研究了 Microsoft 的Running Total快速度量,因為它在單表情況下不起作用,並且需要星型模式才能正常工作。

因此,我展示了一個更簡單的替代方案,無論它是星型模式還是單表模型,都可以使用而無需計算。 

計算 DAX 公式

本博客將深入研究一種稱為“每個類別平均數”的快速度量。如果您使用的是 LuckyTemplates 桌面,請首先轉到“字段”窗格並創建一個新的快速度量

CALCULATE DAX 函數:問題與解決方案

在彈出的“快速測量”窗口中,在“計算”下拉列表中選擇“每個類別的平均值”。然後,拖動? 基值文本字段中的類別字段中的月份

CALCULATE DAX 函數:問題與解決方案

然後單擊“確定”,您將獲得如下所示的視覺效果。 

CALCULATE DAX 函數:問題與解決方案

x 軸是四分之一——第 1、2、3 和 4 季度。 

您要做的是總結如下所示每個月的值,然後取這些值的平均值。簡而言之,每個類別的平均值,這是我們博客的主題。 

CALCULATE DAX 函數:問題與解決方案

我們的數據模型非常簡單。我們有一個表,其中包含Dates、隨機生成的Values以及單獨列中的MonthMonthSortQuarters。 

CALCULATE DAX 函數:問題與解決方案

我們的日期表中有與日曆表、月份、月份排序和季度相同的內容。這意味著我們可以從日期表或第一個表中選擇季度或月份。 

CALCULATE DAX 函數:問題與解決方案

Average Per Category 的好消息是,無論您使用的是單表模型還是星型模式,它實際上都能正常工作。

在這些視覺效果中,我們使用第一個表中的季度......

CALCULATE DAX 函數:問題與解決方案

 …而這個使用我們日期表中的季度。無論哪種方式都有效。 

CALCULATE DAX 函數:問題與解決方案

但 Average Per Category 的問題只是 DAX 代碼。 

CALCULATE DAX 函數:問題與解決方案

這個 DAX 代碼很奇怪,因為即使你是 DAX 專家,乍一看也可能會感到困惑。它是用沒有過濾子句的 CALCULATE 語句構造的,只是包含了一個 sum 語句。 

事實上,當我在論壇上看到人們使用 CALCULATE 無緣無故地包裝一個總和時,這是我最討厭的事情之一。但在這種情況下,其實是有原因的。

每當我看到這些時,我都會感到困惑,因為這只是一個直接的跡象,表明他們不知道他們在使用 CALCULATE 函數做什麼。所以我建議遠離它。 

每個類別平均值的 DAX 代碼

上面顯示的 DAX 代碼使用。此函數不在 CALCULATE 段中,這再次使其變得奇怪。據推測,此函數是為在基於其文檔的 CALCULATE 語句中使用而構建的。

該代碼還使用了,我不同意。他們永遠不應該使用 VALUES,因為如果存在不匹配的行,不同的值往往會返回空白行。這會給您帶來很多麻煩,但這是另一個視頻的主題。

本質上,這裡發生的事情是他們使用 VALUES 函數來獲取我們所有的類別。例如,在第一季度,即一月、二月和三月。VALUES 也返回一個表,但他們使用 KEEPFILTER 語句使其作為中的第一個參數有效。 

它們還保持 CALCULATE 函數在 KEEPFILTERS 的上下文中執行。由於 AVERAGEX 的工作方式,它採用第二個表達式並在第一個表達式的上下文中執行它。 

那麼問題是什麼?

總的來說,它工作正常,但不適合 DAX 新手。我相信微軟在創建這種快速測量時真的錯過了機會,因為快速測量應該是為 DAX 新手準備的。

快速度量是一個好主意,例如“讓我們為您編寫一些具有不同計算的常用度量,因為您是 DAX 的新手並且您並不了解有關 DAX 的所有知識。” 但他們為什麼要以如此奇怪、複雜的方式建造它們呢? 

DAX 的新手應該怎麼看這個並弄清楚發生了什麼,甚至 DAX 專業人士可能都在為這個問題摸不著頭腦? 

所以對我來說,他們錯過了一個千載難逢的機會來幫助人們通過他們的快速措施學習 DAX,因為他們堅持要包括 CALCULATE 並且必須跳過箍才能獲得 CALCULATE 。 

更簡單的解決方案

使用 SUMMARIZE 函數

正如我之前提到的,有一種更好、更簡單的方法可以做到這一點。

首先,使用VAR_Table創建一個表變量。然後,我們將使用來獲取表,按月對其進行匯總,創建一個值列,並對我們的值求和。

最後,我們將使用AVERAGEX函數取平均值。 

CALCULATE DAX 函數:問題與解決方案

這段代碼更簡單,也更合乎邏輯。它不包括 CALCULATE,您無論如何都不需要它。 

您可能會看到一篇批評 SUMMARIZE 的博客文章。博客說 SUMMARIZE 內部工作的方式相當複雜。

它還表明您可能會在一種特定情況下讓自己陷入困境,但您永遠不會遇到它。只有當您的計算涉及非常複雜的計算和非常大的表時才會發生這種情況。只有這樣 SUMMARIZE 才會給你不穩定的結果。 

至少博客文章是這麼說的。如果您想迴避 SUMMARIZE 也沒關係。在這種情況下,請改用函數。

使用 GROUPBY 函數

沒有人對使用 GROUPBY 函數有任何問題,所以讓我們也學習如何使用它。同樣,使用 VAR_Table 創建一個表變量然後,我們GROUPBY Month 並創建一個 Value 列。

接下來,我們使用CURRENTGROUP應用,這就是 GROUPBY 的工作原理。讓我們總結一下我們的價值,並再次對它 進行AVERAGEX 。

我們的代碼應該是這樣的。

CALCULATE DAX 函數:問題與解決方案

比較結果:SUMMARIZE vs GROUPBY vs CALCULATE DAX 函數

現在,讓我們看看我們所做的快捷方式是否返回相同的結果。 

正如您在下圖中看到的,標記為“每個類別的平均水平更好”的SUMMARIZE和標記為“每個類別的平均水平更高”的 GROUPBY返回相同的數字。 

CALCULATE DAX 函數:問題與解決方案

我們的兩個公式都為 Q1 返回 3.4K,為 Q2 返回 3.6K,為 Q3 返回 3.4K,為 Q4 返回 3.5K。同樣,他們在單表數據模型中工作,對我們的表使用季度。

它們還在星型模式中工作,我們在日期表中使用季度。 

CALCULATE DAX 函數:問題與解決方案


快速測量——如何在 LuckyTemplates 模型中使用它們
使用 LuckyTemplates 內部的計算函數
在 LuckyTemplates 中使用 GROUPBY 函數的有效方法

結論

我們不需要為了將 CALCULATE 納入我們的公式而強迫自己進入扭曲的上下文邏輯。只需使用簡單的標準 DAX 函數,您就可以實現相同的目的。 

事實上,可能在 80% – 90% 的情況下,絕對沒有理由為任何事情使用 CALCULATE。相反,您可以使用更簡單、更合乎邏輯的 SUMMARIZE 和 GROUPBY 函數。

如果您想探索這個 PBIX 文件,我已經將它發佈到 Quick Measures Gallery 並將文件命名為Better Average Per Category。只需一直向下滾動頁面,找到您可以下載並自己玩的 PBIX 文件。 

一切順利,

格雷格·德克勒


什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

什麼是 Python 中的自我:真實世界的例子

如何在 R 中保存和加載 RDS 文件

如何在 R 中保存和加載 RDS 文件

您將學習如何在 R 中保存和加載 .rds 文件中的對象。本博客還將介紹如何將對像從 R 導入 LuckyTemplates。

回顧前 N 個工作日——DAX 編碼語言解決方案

回顧前 N 個工作日——DAX 編碼語言解決方案

在此 DAX 編碼語言教程中,了解如何使用 GENERATE 函數以及如何動態更改度量標題。

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

在 LuckyTemplates 中使用多線程動態視覺技術展示見解

本教程將介紹如何使用多線程動態可視化技術從報告中的動態數據可視化中創建見解。

LuckyTemplates 篩選上下文簡介

LuckyTemplates 篩選上下文簡介

在本文中,我將貫穿過濾器上下文。篩選上下文是任何 LuckyTemplates 用戶最初應該了解的主要主題之一。

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

使用 LuckyTemplates 在線服務中的應用程序的最佳技巧

我想展示 LuckyTemplates Apps 在線服務如何幫助管理從各種來源生成的不同報告和見解。

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

隨著時間的推移分析利潤率變化——使用 LuckyTemplates 和 DAX 進行分析

了解如何在 LuckyTemplates 中使用度量分支和組合 DAX 公式等技術計算利潤率變化。

DAX Studio 中數據緩存的物化想法

DAX Studio 中數據緩存的物化想法

本教程將討論數據緩存物化的想法,以及它們如何影響 DAX 在提供結果時的性能。

使用 LuckyTemplates 進行業務報告

使用 LuckyTemplates 進行業務報告

如果直到現在你還在使用 Excel,那麼現在是開始使用 LuckyTemplates 來滿足你的業務報告需求的最佳時機。

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的

什麼是 LuckyTemplates 網關?所有你必須知道的