2.5 格式化DAX代碼

第2章 DAX簡介

2.1 理解DAX計算
2.2了解計算列和度量值
2.3 變量入門
2.4 表達(dá)式中的錯誤處理
2.5 格式化DAX代碼
2.6 聚合函數(shù)和迭代函數(shù)
2.7 使用常見的DAX函數(shù)

格式化DAX代碼

在繼續(xù)解釋DAX語言之前,我們要介紹DAX的一個重要方面,即格式化代碼。DAX是一種函數(shù)語言,這意味著無論它多么復(fù)雜,DAX表達(dá)式其實都像一個函數(shù)調(diào)用。代碼的復(fù)雜性轉(zhuǎn)化為用作最外層函數(shù)的參數(shù)的表達(dá)式的復(fù)雜性。

因此,通常會看到超過10行或更多行的表達(dá)式,看到20行的DAX表達(dá)式也是家常便飯,對此您將不會陌生。但是,隨著公式的長度和復(fù)雜性的增加,對代碼進(jìn)行格式化以使其易于閱讀就顯得非常重要。

沒有格式化DAX代碼的"官方"標(biāo)準(zhǔn),但是我們認(rèn)為標(biāo)準(zhǔn)對格式化代碼很重要。以下介紹的可能不是完美的標(biāo)準(zhǔn),您可能會喜歡一些不同的東西,對此沒有任何問題:找到最佳標(biāo)準(zhǔn)并使用它。您唯一需要記住的是:格式化代碼,永遠(yuǎn)不要在一行上編寫所有內(nèi)容;否則,您將比預(yù)期更早陷入麻煩。

為了理解格式化為何如此重要的原因,來看一個時間智能計算的公式,這個公式有點復(fù)雜,但遠(yuǎn)不是最復(fù)雜的公式。如果不以某種方式設(shè)置表達(dá)式的格式,則它的樣子如下:

IF(CALCULATE(NOT ISEMPTY(Balances), ALLEXCEPT
(Balances, BalanceDate)),SUMX (ALL(Balances
[Account]), CALCULATE(SUM
(Balances[Balance]),LASTNONBLANK(DATESBETWEEN(BalanceDate[Date],
BLANK(),MAX(BalanceDate[Date])),CALCULATE(COUNTROWS(Balances))))),BLANK())

現(xiàn)在這個樣子,要試圖了解該公式計算的內(nèi)容幾乎是不可能的。沒有最外層函數(shù)的線索,以及DAX如何評估不同的參數(shù),創(chuàng)建完整的執(zhí)行流程。我們已經(jīng)看到了太多學(xué)生編寫出這樣的公式,他們有時會尋求我們的幫助,以了解為什么公式返回錯誤的結(jié)果,你猜怎么了?我們要做的第一件事,就是格式化表達(dá)式,完成以后我們才開始研究它。同一表達(dá)式正確格式化后如下所示:

IF (
    CALCULATE (
        NOT ISEMPTY ( Balances ),
        ALLEXCEPT (
            Balances,
            BalanceDate
        )
    ),
    SUMX (
        ALL ( Balances[Account] ),
        CALCULATE (
            SUM ( Balances[Balance] ),
            LASTNONBLANK (
                DATESBETWEEN (
                    BalanceDate[Date],
                    BLANK (),
                    MAX ( BalanceDate[Date] )
                ),
                CALCULATE (
                    COUNTROWS ( Balances )
                )
            )
        )
    ),
    BLANK ()
)

代碼是相同的,但是這次更容易看到IF的三個參數(shù)。最重要的是,縮進(jìn)線自然形成了功能塊,更容易弄清完整的執(zhí)行流程。該代碼仍然很難閱讀,但是現(xiàn)在的問題是DAX本身,而不是格式化做得差。更詳細(xì)的使用變量的語法可以幫助您閱讀代碼,即使這樣,格式化對于正確理解每個變量的范圍也很重要:

IF (
    CALCULATE (
        NOT ISEMPTY ( Balances ),
        ALLEXCEPT (
            Balances,
            BalanceDate
        )
    ),
    SUMX (
        ALL ( Balances[Account] ),
        VAR PreviousDates =
            DATESBETWEEN (
                BalanceDate[Date],
                BLANK (),
                MAX ( BalanceDate[Date] )
            )
        VAR LastDateWithBalance =
            LASTNONBLANK (
                PreviousDates,
                CALCULATE (
                    COUNTROWS ( Balances )
                )
            )
        RETURN
            CALCULATE (
                SUM ( Balances[Balance] ),
                LastDateWithBalance
            )
    ),
    BLANK ()
)

DAXFormatter.com
我們創(chuàng)建了一個專門用于格式化DAX代碼的網(wǎng)站。我們?yōu)樽约簞?chuàng)建此站點是因為格式化代碼是一項耗時的操作,我們把時間花在了格式化自己寫的每個公式上。當(dāng)該工具可用時,我們決定將其捐贈給公共領(lǐng)域,以便用戶可以格式化自己的DAX代碼(順便說一下,我們已經(jīng)能夠以此來推廣我們的格式化規(guī)則)。

您可以在以下網(wǎng)站找到:
http://www.daxformatter.com/) [www.daxformatter.com](www.daxformatter.com

用戶界面很簡單:只需復(fù)制DAX代碼,單擊FORMAT,頁面就會刷新,顯示格式良好的代碼版本,然后可以將其復(fù)制并粘貼到原始窗口中。

這是我們用來格式化DAX的一組規(guī)則:

  • 始終使用空格將函數(shù)名稱(例如IF,SUMXCALCULATE)與任何其他術(shù)語分開,并始終以大寫形式書寫。
  • 將所有列引用以TableName [ColumnName]的形式編寫,表名和方括號之間沒有空格。始終包含表名。
  • 將所有度量值引用以[MeasureName]的形式編寫,沒有任何表名。
  • 始終在逗號后使用空格,并且切勿在逗號前加空格。
  • 如果公式適合一行,請不要應(yīng)用任何其他規(guī)則。
  • 如果公式不適合一行,則:
  • 將函數(shù)名稱連同左括號單獨放在一行上,
  • 將所有參數(shù)放在單獨的行上,縮進(jìn)四個空格,除了最后一個參數(shù)外,以逗號結(jié)尾。
  • 將右括號與調(diào)用的函數(shù)對齊,單獨一行。

這些是我們使用的基本規(guī)則。有關(guān)這些規(guī)則的詳細(xì)列表,請訪問:
http://sql.bi/daxrules 。

如果您找到一種最適合您的閱讀方式的公式表達(dá)方法,請使用它。格式化的目的是使公式更易于閱讀,因此請使用最適合您的技術(shù)。定義個人格式規(guī)則時要記住的最重要一點是,您始終需要能夠盡快看到錯誤。象如前所述的未格式化代碼中,如果缺少右括號,是很難發(fā)現(xiàn)錯誤所在的。在格式化的公式中,更容易看到每個右括號如何與調(diào)用函數(shù)的左括號匹配。

格式化DAX提示:
格式化DAX并非易事,因為通常我們在文本框中使用小字體編寫DAX。Power BI,Excel和Visual Studio不同的版本為DAX提供不同的文本編輯器。以下這些提示有助于編寫DAX代碼。
要增加字體大小,請在按住Ctrl的同時旋轉(zhuǎn)鼠標(biāo)上的滾輪按鈕,以便更輕松地查看代碼。
要在公式中添加新行,請按Shift + Enter。
如果您不適合在文本框中進(jìn)行編輯,請將代碼復(fù)制到另一個編輯器(如記事本或DAX Studio)中,然后將公式復(fù)制并粘貼回文本框中。
當(dāng)您查看DAX表達(dá)式時,乍一看可能很難理解它是計算列還是度量。因此,在我們的書和文章中,每當(dāng)定義計算列時都使用等號(=),并使用賦值運算符(:=)定義度量值。

CalcCol = SUM  ( Sales[SalesAmount] )        -- is a calculated  column
Store[CalcCol] = SUM ( Sales[SalesAmount] )  -- is a calculated column in Store table
CalcMsr := SUM  ( Sales[SalesAmount]  )      -- is a measure

最后,就像我們在每個示例中一樣,在代碼中使用列和度量值時,我們建議總是將表名放在列之前,永遠(yuǎn)不要將表名放在度量值之前。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

推薦閱讀更多精彩內(nèi)容