常見的DAX函數返回的是一個值,比如SUM,MAX等,稱為值函數,與此同時,DAX中還有很多返回表的表函數,比如FILTER,ALL,VALUES,DISTINCT這些都是比較常用的表函數,新建度量值、新建列都是需要返回一個值,如果用返回表的表達式來創建,将會報錯,而新表就是利用DAX創建一個表,它使用的就是返回表的表達式。今天我們來介紹的就是除了上述所說的表函數外,還有一些生成笛卡爾積和返回彙總表的表函數,他們也是我們工作中會經常用來做輔助計算的。
首先,我們來生成一張銷售表,在這個過程中,我們将會簡單介紹一下生成笛卡爾積表的函數GENERATE和CROSSJOIN。
函數示例一:GENERATE應用示例
銷售表 =
GENERATE (
ADDCOLUMNS (
CALENDAR ( DATE ( 2019, 1, 1 ), TODAY () ),
"月", MONTH ( [Date] ),
"銷量", RANDBETWEEN ( 0, 300 )
),
DATATABLE ( "門店", STRING, { { "北京" }, { "上海" }, { "廣州" }, { "深圳" } } )
)
在實例的這個函數中,GENERATE,ADDCOLUMNS,DATATABLE,是主要需要說明的三個生成表的函數。
ADDCOLUMNS函數(DAX)
ADDCOLUMNS(<table>, <name>, <expression>[,<name>, <expression>]…)
參數:
table:任何返回表的 DAX 表達式。
name:給予此列的名稱,包含在雙引号内。
expression:任何返回要填充 name 的單個标量值的 DAX 表達式。
返回值:
返回具有DAX表達式指定的新列的表。
ADDCOLUMNS顧名思義,添加列,在什麼上添加列,在某個原始表中添加所需要的列。所以這個函數的第一個參數為表或返回表的表達式,在該表中添加列;第二個參數和第三個參數分别為要添加的列的列名和列值;有的時候隻添加一列并不能滿足我們的需求,那怎麼辦呢?诶,ADDCOLUMNS這個函數可以一直往後面添加列,它的第四個參數和第五個參數就分别為要繼續添加的列的列名和列值;以此類推……
ADDCOLUMNS(
CALENDAR ( DATE ( 2019, 1, 1 ), TODAY() ),
"月", MONTH ( [Date] ),
"銷量", RANDBETWEEN ( 0, 300 )
)
就是生成了一個在含有一列日期的日期表的基礎上添加了列名為“月”和“銷量”的列。如下:
DATATABLE函數(DAX)
DATATABLE (ColumnName1, DataType1, ColumnName2, DataType2...,{{Value1, Value2...}, {ValueN, ValueN 1...}...})
參數:
ColumnName:任何返回表的 DAX 表達式。
DataType:數據類型。一個枚舉,其中包含:INTEGER、DOUBLE、STRING、BOOLEAN、CURRENCY、DATETIME
Value:單個自變量。它将 Excel 語法用于一維數組常量,該常量嵌套為提供數組的數組。此參數表示将在表中的一組數據值
返回值:
聲明内聯值集的表。
DATATABLE顧名思義,數據表,DATATABLE函數的參數:DATATABLE (列名1, 數據類型1, 列名2, 數據類型2..., {{值1, 值2...},{值N, 值N 1...}...})
前面的參數用來指定 列名 和 這一列的數據類型,後面 {}包含了數據,每一行都放在一對 { } 中,且用逗号分隔。數據類型支持:string,integer,currency,double,datetime,boolean(布爾型,也就是 true 或 false)。
DATATABLE( "門店", STRING, { { "北京" }, { "上海" }, { "廣州" }, { "深圳" } } )
就是生成了一個列名為“門店”,數據類型為文本型,值集包含了北京上海廣州深圳的一列。如下:
GENERATE 函數 (DAX)
GENERATE(<table1>, <table2>)
參數:
table1任何返回表的 DAX 表達式。
table2任何返回表的 DAX 表達式。
返回值:
一個表以及一個笛卡爾積,後者是在 table1 中的每行與通過在 table1 中的當前行的上下文中計算 table2 所得到的表之間計算獲得的。
GENERATE函數的參數非常簡單,就是兩個表,但它的内部計算邏輯其實比較複雜,初識這個函數的時候我們隻需要了解它并不是簡單的分别計算了兩張表再合并到一起,而是它第一個參數表的每一行,為第二個表的表達式提供了行上下文,在每一行上分别計算第二個表的表達式。
GENERATE (
ADDCOLUMNS (
CALENDAR ( DATE ( 2019, 1, 1 ), TODAY () ),
"月", MONTH ( [Date] ),
"銷量", RANDBETWEEN ( 0, 300 )
),
DATATABLE ( "門店", STRING, { {"北京" }, { "上海"}, { "廣州" }, { "深圳" } } )
)
就是生成了一個前兩個表相乘的笛卡爾積表。如下:
函數示例二:CROSSJOIN應用示例
與GENERATE類似的還有另一個可以生成笛卡爾積表的函數叫做CROSSJION。
CROSSJOIN函數(DAX)
CROSSJOIN(<table>,<table>[, <table>]…)
參數:
table:任何返回數據表的 DAX 表達式數
返回值:
返回一個包含這些參數的所有表中所有行的笛卡爾積的表。新表中的各列是所有參數表中的所有列。
銷售表1 = CROSSJOIN('銷售表','dim商品名稱')
CROSSJOIN的參數與GENERATE 函數 的參數類似,就是兩個表,返回的結果即為兩表相乘的交叉積。在這個公式中,CROSSJOIN的第一個參數是銷售表,第二個參數是一列含有商品A,商品B,商品C,商品D的商品名稱維度表,交叉相乘結果如下:
至此,我們已經介紹了四個生成表的函數,ADDCOLUMNS,DATATABLE, CROSSJOIN和 GENERATE,并且寫出了一個接下來我們會用到的銷售表。
方法一:第一個比較容易想到的返回彙總表的函數應該是SUMMARIZE
SUMMARIZE函數(DAX)
SUMMARIZE(<table>,<groupBy_columnName>[, <groupBy_columnName>]…[, <name>,<expression>]…)
參數:
Table:任何返回數據表的 DAX 表達式。
groupBy_columnName:可選)現有列的限定名稱,将使用該列中找到的值創建摘要組。此參數不能是表達式。
Name:給予總計或彙總列的名稱,包含在雙引号内。
Expression:任何返回單個标量值的 DAX 表達式,其中,表達式将計算多次(針對每行/上下文)。
返回值:
針對一系列組所請求的總計返回摘要表,即其中包含 groupBy_columnName 參數的選定列和由名稱參數設計的彙總列的表。
銷售表3 = SUMMARIZE('銷售表1','銷售表1'[門店],'銷售表1'[月],"月銷量",SUM('銷售表1'[銷量]))
1、SUMMARIZE第一個參數是表,第二個參數是某一列,先不寫其他參數列時,會返回該表的不重複列表。用于提取維度表,同VALUES和DISTINCT的用法類似。
dim門店 = SUMMARIZE('銷售表','銷售表'[門店])
dim門店 = VALUES('銷售表','銷售表'[門店])
dim門店 =DISTINCT('銷售表','銷售表'[門店])
以上表達式都是提取維度表的做法,可以提取到不重複的門店名稱。
2、當我們為SUMMARIZE添加第三個參數列時,它會返回這些列的有效組合,但不同于上述GENERATE或CROSSJOIN返回的是笛卡爾積一樣,它返回的隻是原銷售表中存在的組合。
3、所以當我們繼續為SUMMARIZE添加第三、四個參數分别是列名和列值表達式時,它會自動計算并返回分組的彙總表。如下,也就是我們想得到的每個月每個門店的銷售額的彙總表。
方法二:利用ADDCOLUMNS和CROSSJOIN的組合返回彙總表
銷售表2 = ADDCOLUMNS(CROSSJOIN(VALUES('銷售表1'[月]),VALUES('銷售表1'[門店])),"月銷量",CALCULATE(SUM('銷售表1'[銷量])))
在此我們可以鞏固一下之前所說的ADDCOLUMNS和CROSSJOIN的用法,CROSSJOIN的兩個參數分别是銷售表1中的月份和門店,CROSSJOIN生成了月份和門店的笛卡爾積,ADDCOLUMNS為這個笛卡爾積表添加了列名為”月銷量”,列值為各月各門店銷量總計的列,至此,每個月每個門店的銷售額的彙總表的第二個方法我們也完成了。
* PowerPivot工坊原創文章,轉載請注明出處!
延伸閱讀:
重點函數 | 表函數與DAX查詢
工坊實驗室 | ISINSCOPE函數的兩個應用場景
工坊實驗室 | CALCULATE的嵌套使用
重點函數 | SELECTEDVALUE用法介紹
重點DAX函數 | LASTNONBLANK用法介紹
如果您想深入學習微軟Power BI,歡迎登錄網易雲課堂試聽學習我們的“從Excel到Power BI數據分析可視化”系列課程。或者關注我們的公衆号(PowerPivot工坊)後猛戳”在線學習”。
長按下方二維碼關注“Power Pivot工坊”獲取更多微軟Power BI、PowerPivot相關文章、資訊,歡迎小夥伴兒們轉發分享~
,
更多精彩资讯请关注tft每日頭條,我们将持续为您更新最新资讯!