針對PowerPivot的DAX函數參考
一、篩選函數
1、ALL函數:傳回表中的所有行貨傳回列中的所有值,同時忽略可能已應用的任何篩選器,此函數可用于清除篩選器對表中的所有行建立計算,傳回删除了篩選器的表或列的值
如:建立一個《路徑成本》
訂單額度 = SUMX(ALL('訂單表'),'訂單表'[amount])
雖然X軸使用日期來統計,顯示的依然是總額度,在不使用ALL函數的一個路徑成本
訂單額度2 = SUMX('訂單表','訂單表'[amount])
沒有使用ALL時候,時間篩選器就生效了,顯示各日的總額。實際應用中可能會分析日訂單和總額的比率:
計算日訂單和總額的比率 = sumx('訂單表','訂單表'[amount])/sumx(ALL('訂單表'),'訂單表'[amount])
ALL (Column[, Column[, …]]) 删除表中指定列的所有篩選器,表中針對其他列的所有篩選器仍應用,建立一個路徑成本:
訂單額度 = SUMX('訂單表','訂單表'[amount])/CALCULATE(SUM('訂單表'[amount]),ALL('訂單表'[create_time],'訂單表'[cancel_rent_time]))
ALLEXCEPT(Table, Column1 [,Column2]...):删除表中所有上下文篩選器,但已應用于制定列的篩選器除外,建立一個路徑成本:
訂單額度 = SUMX('訂單表','訂單表'[amount])/SUMX(ALLEXCEPT('訂單表','訂單表'[create_time],'訂單表'[rent_pay_time],'訂單表'[deposit_withdraw_time]), '訂單表'[amount])
ALLSELECTED:選取需要字段過濾其他,隻能添加一個參數,同時忽略選取字段的篩選器,其他已應用的篩選器仍然生效,選取的時間仍然建立路徑成本的表,建立一個路徑成本:
訂單額度 = SUMX('訂單表','訂單表'[amount])/CALCULATE(SUMX('訂單表','訂單表'[amount]),ALLSELECTED('訂單表'[create_time]))
對比沒有allselectd的情況下的篩選
ALLNOBLANKROW函數:從關系的父表中,傳回除空白行之外的所有行,或某一列中除空白行之外的所有非重複值,并且忽略可能存在所有上下文的篩選器。
若選table要删除其所有上下文篩選器的表,列同理,建立一個路徑成本
訂單額度222 = CALCULATE(SUMX('訂單表','訂單表'[amount]),ALLNOBLANKROW('訂單表'))
Datekey是張時間的次元表和和訂單表相關聯
,選自己的表的時間,列出目前時間,
使用時間次元表,次元表所有的時間都會顯示一個同一個值
2、CALCULATE函數:計算由指定篩選器修改的上下文中的表達式,作為表達式的結果值傳回。
文法:CALCULATE(<expression>,<filter1>,<filter2>…)
expression要進行計算的表達式
filter1…N定義篩選器的布爾表達式或表表大師的逗号分隔的清單
建立一個路徑成本:
限制:不能引用路徑成本、不能使用CALCULATE嵌套、不能使用掃描表或傳回任何函數及聚合函數
訂單額度 = CALCULATE(SUM('訂單表'[amount]),(ALL('訂單表')))
CALCULATETABLE函數:在由給定篩選修改的上下文中計算表表達式,傳回包含值得表,在BPI中的模組化點建立表,此時不能使用建立路徑成本。
新路徑成本 = SUMX(CALCULATETABLE('訂單表','PowerBi 時間次元表'[DayOfMonthFull]="18"),'訂單表'[amount])
此時嵌套在聚合函數裡,傳回值的清單
此時說明表達式傳回表的多列值,隻是根據條件過濾不比對status=100de
3、DISTINCT:傳回一列構成的一個表,該表包含來自指定列的非重複值,一般配合其他聚合函數來使用
文法:DISTINCT(<column>)
路徑成本cal = COUNTROWS(DISTINCT('訂單表'[status]))
4、EARLIER函數:傳回提及的列的外部計算傳遞中指定列的目前值(在想要使用某個值作為輸入并且基于該輸入進行計算的嵌套計算中)
官檔案例
5、EARLIEST函數:傳回指定列的外部計算傳遞中制定列的目前值,與4類似
HASONEVALUE:已将columnName的上下文篩選為隻剩下一個非重複值時傳回TRUE,否則FALSE
7、RELATED函數:從另一個表傳回相關值,與目前行相關的單個值
RELATED 函數要求目前表與包含相關資訊的表之間存在關系。您需要指定包含所需資料的列,該函數将通過現有的多對一關系從相關表中的指定列中提取值
8、RELATEDTABLE函數:由給定篩選器修改的上下文中計算表表達式,傳回包含值得表
RELATEDTETABLE 函數将更改篩選資料的上下文,并在您指定的新上下文中計算表達式。對于在篩選器參數中使用的每一列,将删除該列上的現有篩選器,改為應用在篩選器參數中使用的篩選器
9、VALUES函數:傳回由一列構成的一個表,包含來自制定列的非重複值。
文法:values(<column>)
當您在已篩選的上下文(例如資料透視表)中使用 VALUES 函數時,VALUES 傳回的唯一值會受到篩選器的影響。例如,如果您按 Region 進行篩選,并且傳回針對 City 的值清單,則該清單将隻包括篩選器允許的區域中的那些城市。若要傳回所有城市,而不管現有篩選器的情況如何,您必須使用 ALL 函數從表中删除篩選器。第二個示例示範如何将ALL 與VALUES 一起使用。
VALUES_1 = COUNTROWS(VALUES('訂單表'[id] ))
統計函數(聚合函數):對值得聚合運算,在篩選函數中已經應用部分,其他類似
DAX 中的 AND 函數隻接受兩 (2) 個參數。如果您需要對多個表達式執行 AND 運算,則可以建立一系列計算;但更好的選擇是,使用連接配接運算符 (&&) 在一個更簡單的表達式中連接配接所有這些列
參數
術語
定義
logical_test
計算結果可以為 TRUE 或 FALSE 的任何值或表達式。
value_if_true
在邏輯測試為 TRUE 時傳回的值。如果省略,則傳回 TRUE。
value_if_false
在邏輯測試為 FALSE 時傳回的值。如果省略,則傳回 FALSE。
如果省略了 value_if_true 或 value_if_false 的值,則 IF 将其視為空字元串值 (""),
如果在表達式中引用的值是某一列,則 IF 将傳回與目前行相對應的值
= IF(SUM('InternetSales_USD'[SalesAmount_USD]) >200000, TRUE(), false())
項
find_text
您要查找的文本。使用雙引号(空文本)可以比對 within_text 中的第一個字元;不允許通配符。
within_text
包含要查找的文本的文本。
start_num
從其開始進行搜尋的字元;如果省略,start_num = 1。within_text 中的第一個字元是字元編号 1。
number
要舍入并轉換為文本的數字,或包含數字的列。
decimals
(可選)小數點右側的位數;如果省略,則為 2。
no_commas
(可選)一個邏輯值:如果為 1,則不在傳回的文本中顯示逗号;如果為 0 或省略,則在傳回的文本中顯示逗号。
value
值或計算結果為單個值的表達式。
format_string
具有格式模闆的字元串。
下表辨別預定義數字格式的名稱。可按名稱将它們用作 Format 函數的樣式參數。
格式規範
說明
"General Number"
顯示不帶千位分隔符的數字。
"Currency"
顯示帶千位分隔符的數字(如果适用);顯示小數點分隔符右側兩位。輸出基于系統區域設定。
"Fixed"
小數點分隔符左側至少顯示一位,右側顯示兩位。
"Standard"
顯示帶千位分隔符的數字,其中小數點分隔符左側至少有一位,右側有兩位。
"Percent"
将數字乘以 100 後顯示,并在緊右側追加百分号 (%);小數點分隔符右側總是顯示兩位。
"Scientific"
使用标準的科學記數法,并且提供兩個有效位數。
"Yes/No"
如果數字為 0,則顯示 No;否則顯示 Yes。
"True/False"
如果數字為 0,則顯示 False;否則顯示 True。
"On/Off"
如果數字為 0,則顯示 Off;否則顯示 On。
使用者定義的數字格式表達式可以包含一至三個部分(各部分之間用分号分隔)。如果 Format 函數的 Style 參數包含預定義的數字格式之一,則隻允許有一部分。
如果您使用
則結果為
隻有一部分
格式表達式應用于所有值。
兩部分
第一部分應用于正值和零;第二部分應用于負值。
三部分
第一部分應用于正值,第二部分應用于負值,第三部分應用于零。
下表辨別了可用于建立使用者定義的數字格式的字元。
無
顯示不帶格式的數字。
0(零字元)
數字占位符。顯示一個數字或一個零。如果表達式在格式字元串中出現零的位置有一個數字,則顯示該數字,否則在該位置顯示一個零。
如果數字的位數少于格式表達式中零的個數(不管在小數點的哪一側),将顯示前導零或尾随零。如果小數點分隔符右側的數字位數多于格式表達式中小數點分隔符右側的零的個數,将對數字四舍五入,使其小數位數與零的個數一樣多。如果小數點分隔符左側的數字位數多于格式表達式中小數點分隔符左側的零的個數,則将顯示多出的位數而不作任何修改。
#
數字占位符。顯示一個數字或不顯示任何内容。如果表達式在格式字元串中出現 # 字元的位置有一個數字,則顯示該數字,否則該位置什麼也不顯示。
除了當數字的位數少于格式表達式中小數點分隔符任意一側的 # 字元數時不顯示前導零或尾随零外,該符号的作用類似于零 (0) 數字占位符。
.(圓點字元)
小數點占位符。小數點占位符确定在小數點分隔符左側和右側顯示幾位數。如果格式表達式中該符号的左側隻包含 # 字元,則小于 1 的數字以小數點分隔符開頭。若要顯示随小數顯示的前導零,請使用零作為小數點分隔符左側的第一個數字占位符。在某些區域設定中,用逗号作為小數點分隔符。在格式化輸出中用作小數點占位符的實際字元取決于系統所識别的數字格式。是以,在您的格式中應将句點用作小數點占位符,即使您位于使用逗号作為小數點占位符的區域設定中。格式化字元串将以适合區域設定的正确格式顯示。
%
百分比占位符。将表達式乘以 100。在格式字元串中出現百分比字元的位置插入百分比字元 (%)。
,(逗号字元)
千位分隔符。千位分隔符将在小數點分隔符左側具有四位或更多位數的數字中的千位和百位分隔開。如果格式包含一個由數字占位符(0 或 #)包圍的千位分隔符,則指定千位分隔符的标準用法。
一個千位分隔符緊挨小數點分隔符的左側(無論是否指定小數)或者作為字元串中最右側的字元表示“通過除以 1000 來将數字按比例減小,并按需要四舍五入”。小于 1,000 但大于或等于 500 的數字顯示為 1,小于 500 的數字顯示為 0。此位置有兩個相鄰千位分隔符表示按一百萬倍的比例因子縮小,并且每增加一個分隔符表示另外縮小 1,000 倍。
多個分隔符出現在緊挨小數點分隔符左側或字元串最右側位置被視為指定使用千位分隔符。在某些區域設定中,用句點作為千位分隔符。在格式化輸出中用作千位分隔符的實際字元取決于您的系統所識别的數字格式。是以,在您的格式中應将逗号用作千位分隔符,即使您位于使用句點作為千位分隔符的區域設定中。格式化字元串将以适合區域設定的正确格式顯示。
例如,考慮以下三個格式字元串:
“#,0.”,該字元串使用千位分隔符将數字一億的格式設定為字元串“100,000,000”。
“#0,.”,該字元串按 1000 的因子進行縮小,将數字一億的格式設定為字元串“100000”。
“#,0,.”該字元串使用千位分隔符和按 1000 的因子進行縮小,将數字一億的格式設定為字元串“100,000”。
:(冒号字元)
時間分隔符。在某些區域設定中,可能用其他字元表示時間分隔符。在設定時間值的格式時,時間分隔符用于分隔小時、分鐘和秒。在格式化輸出中用作時間分隔符的實際字元取決于您的系統設定。
/(正斜杠字元)
日期分隔符。在某些區域設定中,可能用其他字元表示日期分隔符。在設定日期值的格式時,日期分隔符用于分隔年、月和日。在格式化輸出中用作日期分隔符的實際字元取決于您的系統設定。
E-、E+、e-、e+
科學記數法格式。如果格式表達式在 E-、E+、e- 或 e+ 的左側至少包含一個數字占位符(0 或 #),則以科學記數法格式顯示數字,并在數字與其指數之間插入 E 或 e。左側的數字占位符的個數決定了指數中的數字個數。使用 E- 或 e- 可在負指數的後面放置一個減号。使用 E+ 或 e+ 可在負指數的後面放置一個減号,在正指數的後面放置一個加号。還必須在該符号右側包括數字占位符以擷取正确的格式。
- + $ ( )
文字字元。這些字元将完全按格式字元串中所鍵入的形式顯示。若要顯示所列字元以外的其他字元,請在該字元前加上一個反斜杠 (\) 或将該字元放在雙引号 (" ") 中。
\(反斜杠字元)
顯示格式字元串中的下一個字元。若要将具有特殊含義的字元顯示為文字字元,請在該字元前加上一個反斜杠 (\)。反斜杠本身不顯示。使用反斜杠與将下一個字元放在雙引号中的作用是相同的。若要顯示反斜杠,請使用兩個反斜杠 (\\)。
不能顯示為文字字元的字元示例為日期格式字元和時間格式字元(a、c、d、h、m、n、p、q、s、t、w、y、/ 和 :)、數字格式字元(#、0、%、E、e、逗号和句點)和字元串格式字元(@、&、<、> 和 !)。
"ABC"
顯示雙引号 (" ") 裡面的字元串。若要将字元串包含在代碼内的樣式參數中,必須将文本放在 Chr (34) 之間(34 為引号 (") 的字元代碼)。
下表包含用于表示數字的一些示例格式表達式。(所有這些示例均假設您的系統區域設定為“英語 - 美國”)第一列包含 Format 函數的格式字元串;如果格式化的資料具有在列标題中給定的值,則其他列包含生成的輸出結果。
格式(樣式)
“5”格式設定為
“-5”格式設定為
“0.5”格式設定為
“0”格式設定為
零長度字元串 ("")
5
-5
0.5
1
0.00
#,##0
$#,##0;($#,##0)
$5
($5)
$1
$0
$#,##0.00;($#,##0.00)
$5.00
($5.00)
$0.50
$0.00
0%
500%
-500%
50%
0.00%
500.00%
-500.00%
50.00%
"$#,##0;;\Z\e\r\o"
$-5
零
注釋
如果包含兩個連續的分号,則缺少的部分用正值的格式顯示。
下表辨別預定義的日期和時間格式的名稱。如果您使用這些預定義的字元串之外的字元串,它們将作為自定義日期和時間格式來解釋。
"General Date"
顯示日期和/或時間。例如 3/12/2008 11:07:31 AM。日期顯示由您的應用程式的目前區域性值确定。
"Long Date" 或者"Medium Date"
根據您的目前區域性的長日期格式顯示日期。例如,2008 年 3 月 12 日,星期三。
"Short Date"
使用您的目前區域性的短日期格式顯示日期。例如 3/12/2008。
"Long Time" 或者"Medium Time"
使用您的目前區域性的長時間格式顯示時間;通常包括小時、分鐘和秒。例如,11:07:31 AM。
"Short Time"
使用您的目前區域性的短時間格式顯示時間。例如,11:07 AM。
下表顯示可用于建立使用者定義的日期/時間格式的字元。
(:)
時間分隔符。在某些區域設定中,可能用其他字元表示時間分隔符。在設定時間值的格式時,時間分隔符用于分隔小時、分鐘和秒。在格式化輸出中用作時間分隔符的實際字元取決于您應用程式的目前區域性值。
(/)
日期分隔符。在某些區域設定中,可能用其他字元表示日期分隔符。在設定日期值的格式時,日期分隔符用于分隔年、月和日。在格式化輸出中用作日期分隔符的實際字元取決于您應用程式的目前區域性。
(%)
用于訓示應以單個字母格式讀取後面的字元,而不考慮任何尾随字母。此外,還用于訓示以使用者定義的格式讀取單個字母格式。有關其他詳細資訊,請參閱以下内容。
d
将天顯示為不帶前導零的數字(例如,1)。如果這是使用者定義的數字格式中的唯一字元,則使用 %d。
dd
将天顯示為帶一個前導零的數字(例如,01)。
ddd
将天顯示為縮寫(例如,Sun)。
dddd
将天顯示為全名(例如,Sunday)。
M
将月顯示為不帶前導零的數字(例如,一月表示為 1)。如果這是使用者定義的數字格式中的唯一字元,則使用 %M。
MM
将月顯示為帶一個前導零的數字(例如,01/12/01)。
MMM
将月顯示為縮寫(例如,Jan)。
MMMM
将月顯示為完整的月份名稱(例如,January)。
gg
顯示時期/時代字元串(例如,A.D.)。
h
使用 12 小時制時鐘将小時顯示為不帶前導零的數字(例如,1:15:15 PM)。如果這是使用者定義的數字格式中的唯一字元,則使用 %h。
hh
使用 12 小時制時鐘将小時顯示為帶前導零的數字(例如,01:15:15 PM)。
H
使用 24 小時制時鐘将小時顯示為不帶前導零的數字(例如,1:15:15)。如果這是使用者定義的數字格式中的唯一字元,則使用 %H。
HH
使用 24 小時制時鐘将小時顯示為帶前導零的數字(例如,01:15:15)。
m
将分鐘顯示為不帶前導零的數字(例如,12:1:15)。如果這是使用者定義的數字格式中的唯一字元,則使用 %m。
mm
将分鐘顯示為帶前導零的數字(例如,12:01:15)。
s
将秒顯示為不帶前導零的數字(例如,12:15:5)。如果這是使用者定義的數字格式中的唯一字元,則使用 %s。
ss
将秒顯示為帶前導零的數字(例如,12:15:05)。
f
顯示秒的小數部分。例如,ff 顯示百分之一秒,而 ffff 顯示萬分之一秒。在使用者定義的格式中最多可以使用 7 個 f 符号。如果這是使用者定義的數字格式中的唯一字元,則使用 %f。
t
使用 12 小時制時鐘,對于中午之前的任何小時都顯示大寫字母 A;對于中午與 11:59 P.M 之間的任何小時都顯示大寫字母 P。如果這是使用者定義的數字格式中的唯一字元,則使用 %t。
tt
對于使用 12 小時制時鐘的區域設定,對中午之前的任何小時都顯示大寫字母 AM;對于中午與 11:59 P.M 之間的任何小時都顯示 PM。
對于使用 24 小時制時鐘的區域設定,不顯示任何内容。
y
将年顯示為不帶前導零的數字 (0-9)。如果這是使用者定義的數字格式中的唯一字元,則使用 %y。
yy
以帶一個前導零的兩位數字格式顯示年(如果适用)。
yyy
以四位數字格式顯示年。
yyyy
z
顯示不帶前導零的時區偏移量(例如,-8)。如果這是使用者定義的數字格式中的唯一字元,則使用 %z。
zz
顯示帶一個前導零的時區偏移量(例如,-08)
zzz
顯示完整的時區偏移量(例如,-08:00)
格式設定字元串區分大小寫。使用不同的大小寫形式,可以擷取不同的格式。例如,當使用字元串“D”格式化日期值時,可以獲得采用長格式的日期(根據您的目前區域設定)。但是,如果将此字母更改為小寫“d”,則可以獲得采用短格式的日期。此外,如果目标格式與任何定義的格式字元串的大小寫都不比對,則可能出現意外結果或錯誤。
日期/時間格式使用目前使用者區域設定來确定字元串的最終格式。例如,若要使用下列格式字元串“M/d/yyyy”來設定日期 1995 年 3 月 18 日,如果使用者區域設定為美國 (en-us),則結果為“3/18/1995”;但如果使用者區域設定為德國 (de-de),則結果為“18.03.1995”
REPLACE 将基于您指定的字元數,用不同的文本字元串替換文本字元串的一部分。
REPT:重複給定次數的文本。使用 REPT 可用一個文本字元串的許多執行個體填充單元格。
DAX與MySQL文法的比較。
1、 檢視表的所有行記錄
Select * from tb_product_order
DAX: 表 = '訂單表' //傳回的表的記錄,不能使用建立路徑成本方法,
需《模組化》--新表
2、 單表過濾條件,在關系型資料庫裡使用WHERE XX=”OO”
SELECT * FROM tb_product_order WHERE STATUS=100
DAX: 表 = FILTER('訂單表','訂單表'[status]=100)
3、多表JOIN連接配接(左外連接配接)
SQL:
SELECT tbp.* FROM tb_product_order tbp
LEFT JOIN dim_renttpye dimr
ON tbp.type=dimr.id WHERE dimr.id=1
DAX:
表 = FILTER('訂單表',RELATED('商品消費方式'[id])=1)
4、單表次元使用分組GROUP BY
SELECT `type`,COUNT(`type`) FROM tb_product_order tb GROUP BY `type`
表 = GROUPBY('訂單表','訂單表'[type],"AAA",COUNTAX(CURRENTGROUP(),'訂單表'[type]))
5、擷取前幾個最大或最小的值
SELECT amount,DATE(create_time) FROM tb_product_order ORDER BY amount ASC LIMIT 3
表 = TOPN(3,'訂單表','訂單表'[amount],ASC)
以上通過簡單的應用傳回包含值得表。
傳回包含值得表的限制:
1、 表達式不能引用路徑成本
2、 表達式不能使用嵌套CALCULATE函數
3、 表達式不能使用掃描表或傳回表的任何函數,包括聚合函數
DAX一些其他函數使用
路徑成本:
累計注冊使用者數 = IF(
MAX('PowerBi 時間次元表'[DateKey].[Date])<TODAY(),
CALCULATE(COUNT('使用者表'[user_id]),FILTER(ALLSELECTED('PowerBi 時間次元表'[DateKey]),'PowerBi 時間次元表'[DateKey] <= MAX('PowerBi 時間次元表'[DateKey]))))
##傳回表,函數嵌套
AA := FILTER(SUMMARIZE('訂單表', '訂單表'[product_id],'訂單表'[create_time],"銷售總額",sum('訂單表'[amount])),[銷售總額]<>0)
原文文章來自博悅平台http://www.hongshulin001.com轉載請注明出處