第3章 使用基本表函數(shù)
將表用作標(biāo)量值
盡管VALUES是表函數(shù),但由于DAX的特殊功能塘辅,我們經(jīng)常使用它來計(jì)算標(biāo)量值:具有單行和單列的表可以當(dāng)作標(biāo)量值使用。想象一下,我們產(chǎn)生了如圖3-13所示的報(bào)告膳算,報(bào)告了按類別和子類別劃分的品牌數(shù)量。
可能還需要在個(gè)數(shù)旁邊查看品牌名稱弛作。一種可能的解決方案是使用VALUES檢索不同的品牌涕蜂,不是進(jìn)行計(jì)數(shù),而是返回它們的品牌名映琳。只有在品牌只有一個(gè)值的特殊情況下机隙,才有可能這樣做。實(shí)際上萨西,在這種情況下有鹿,可以返回VALUES的結(jié)果,而DAX會(huì)自動(dòng)將其轉(zhuǎn)換為標(biāo)量值谎脯。為了確保只有一個(gè)品牌葱跋,需要使用IF語句保護(hù)代碼:
Brand Name :=
IF (
COUNTROWS ( VALUES ( Product[Brand] ) ) = 1,
VALUES ( Product[Brand] )
)
結(jié)果在圖3-14中可見。當(dāng)“品牌名稱”列為空時(shí)源梭,表示存在兩個(gè)或更多不同的品牌娱俺。
Brand Name 度量值使用 COUNTROWS 來檢查 Products 表的 Color 列是否僅選擇了一個(gè)值荠卷。因?yàn)榇四J皆贒AX代碼中經(jīng)常使用,所以有一個(gè)更簡單的函數(shù)可以檢查列是否只有一個(gè)可見值:HASONEVALUE烛愧。以下是基于 HASONEVALUE 的Brand Name 度量值的更好實(shí)現(xiàn):
Brand Name :=
IF (
HASONEVALUE ( 'Product'[Brand] ),
VALUES ( 'Product'[Brand] )
)
此外僵朗,為使開發(fā)人員的更輕松,DAX還提供了一種功能屑彻,該功能可自動(dòng)檢查列是否包含單個(gè)值,如果包含顶吮,則將其作為標(biāo)量返回社牲。如果有多個(gè)值,則還可以定義要返回的默認(rèn)值悴了。該函數(shù)為SELECTEDVALUE搏恤。先前的度量也可以定義為
Brand Name := SELECTEDVALUE ( 'Product'[Brand] )
通過包含第二個(gè)可選參數(shù),可以提供一條消息湃交,指出結(jié)果包含多個(gè)結(jié)果:
Brand Name := SELECTEDVALUE ( 'Product'[Brand], "Multiple brands" )
最新度量值的結(jié)果在圖3-15中可見熟空。
如果不是要列出 “Multiple brands”這樣的信息搞莺,而是要列出所有品牌怎么辦息罗?在這種情況下,一種選擇是迭代Product [Brand]的VALUES并使用CONCATENATEX函數(shù)才沧,即使存在多個(gè)值迈喉,該函數(shù)也會(huì)產(chǎn)生良好的結(jié)果:
[Brand Name] :=
CONCATENATEX (
VALUES ( 'Product'[Brand] ),
'Product'[Brand],
", "
)
現(xiàn)在绍刮,結(jié)果包含用逗號(hào)分隔的不同品牌,而不是籠統(tǒng)的消息挨摸,如圖3-16所示孩革。
。