再談 PowerBI 分組的博大精深

前言

本人不才匀奏,之前已經(jīng)簡單與大家聊過 Power BI 中的分組問題了鞭衩,近日朋友又問了一個實際工作中的問題,恰巧也與分組有關(guān)娃善,便整理之后论衍,與眾位朋友共享,再談 Power BI 分組的博大精深聚磺。

問題

需求

現(xiàn)在有一張事實表坯台,樣例如下

訂單ID 訂單日期 郵寄方式 產(chǎn)品ID 銷售額
US-2018-1357144 2019/4/27 二級 辦公用-用品-10002717 129.696
CN-2018-1973789 2019/6/15 標(biāo)準(zhǔn)級 辦公用-信封-10004832 125.44
CN-2018-1973789 2019/6/15 標(biāo)準(zhǔn)級 辦公用-裝訂-10001505 31.92
US-2018-3017568 2019/12/9 標(biāo)準(zhǔn)級 辦公用-用品-10003746 321.216
CN-2017-2975416 2018/5/31 二級 辦公用-器具-10003452 1375.92
CN-2016-4497736 2017/10/27 標(biāo)準(zhǔn)級 技術(shù)-設(shè)備-10001640 11129.58
CN-2016-4497736 2017/10/27 標(biāo)準(zhǔn)級 辦公用-裝訂-10001029 479.92
CN-2016-4497736 2017/10/27 標(biāo)準(zhǔn)級 家具-椅子-10000578 8659.84
CN-2016-4497736 2017/10/27 標(biāo)準(zhǔn)級 辦公用-紙張-10001629 588
CN-2016-4497736 2017/10/27 標(biāo)準(zhǔn)級 辦公用-系固-10004801 154.28
…… …… …… …… ……

朋友想對各個產(chǎn)品ID平均銷售額進行分組操作,分成以下8組

組別 最小值 最大值
小于等于100 100
100 ~ 500 100 500
500 ~ 1000 500 1000
1000 ~ 2000 1000 2000
2000 ~ 3000 2000 3000
3000 ~ 4000 3000 4000
4000 ~ 5000 4000 5000
大于等于5000 5000

朋友的解決方案

不難看出瘫寝,事實表的每一行均為一張訂單蜒蕾,所以先要得到一張中間表每個產(chǎn)品ID平均銷售額的中間表。

于是朋友使用 Power BI 中的 DAX 構(gòu)建表的方式焕阿,構(gòu)建了一張中間表咪啡。公式如下:

中間表 =
SUMMARIZE ( '訂單', '訂單'[產(chǎn)品ID], "平均銷售額", AVERAGE ( '訂單'[銷售額] ) )

結(jié)果樣例如下:

P1_中間表.png

然后使用 DAX 增加計算列,公式如下:

分組列 =
SWITCH (
    TRUE (),
    '中間表'[平均銷售額] < 100, "小于等于100",
    '中間表'[平均銷售額] >= 100
        && '中間表'[平均銷售額] < 500, "100 ~ 500",
    '中間表'[平均銷售額] >= 500
        && '中間表'[平均銷售額] < 1000, "500 ~ 1000",
    '中間表'[平均銷售額] >= 1000
        && '中間表'[平均銷售額] < 2000, "1000 ~ 2000",
    '中間表'[平均銷售額] >= 2000
        && '中間表'[平均銷售額] < 3000, "2000 ~ 3000",
    '中間表'[平均銷售額] >= 3000
        && '中間表'[平均銷售額] < 4000, "3000 ~ 4000",
    '中間表'[平均銷售額] >= 4000
        && '中間表'[平均銷售額] < 5000, "4000 ~ 5000",
    '中間表'[平均銷售額] >= 5000, "大于等于5000"
)

之后就完成了數(shù)據(jù)準(zhǔn)備暮屡,得到了下表:

P2_計算列.png

之后僅需將分組列產(chǎn)品ID的計數(shù)拖入表格即可得到結(jié)果撤摸。

P3_結(jié)果1.png

朋友的困擾

但是老板的需求要是這么簡單就好了,老板希望可以根據(jù)訂單日期進行篩選,但是現(xiàn)在的這個方法准夷,訂單日期的篩選完全無效钥飞。

P4_朋友的困擾.gif

解法

看過我之前博文的戰(zhàn)友應(yīng)該能有些思路,這類問題冕象,就應(yīng)該使用 DAX 來解決代承,我們不做計算列,不做中間表渐扮,全都應(yīng)該依靠 DAX 的模型能力论悴。應(yīng)了佐羅老師的一句名言:DAX 驅(qū)動可視化,非侵入式的模型設(shè)計∧孤桑現(xiàn)在且聽我娓娓道來膀估。

準(zhǔn)備

為了分組,當(dāng)然要準(zhǔn)備一張分組表耻讽,可用的方式有很多察纯,例如再導(dǎo)入一張分組表等等,此處使用 DAX 表達式针肥,構(gòu)建一張分組表饼记,公式如下:

分組表 =
DATATABLE (
    "組別", STRING,
    "最小值", INTEGER,
    "最大值", INTEGER,
    {
        { "< 100", -999999, 100 },
        { "100 ~ 500", 100, 500 },
        { "500 ~ 1000", 500, 1000 },
        { "1000 ~ 2000", 1000, 2000 },
        { "2000 ~ 3000", 2000, 3000 },
        { "3000 ~ 4000", 3000, 4000 },
        { "4000 ~ 5000", 4000, 5000 },
        { "> 5000", 5000, 999999 }
    }
)

其中 DATATABLE 函數(shù)用于構(gòu)建一張表,前半部分用于說明表結(jié)構(gòu)慰枕,后半部分用于填入數(shù)據(jù)具则。之后就得到了下表:

P5_構(gòu)建分組表.png

表達式詳解

準(zhǔn)備已成,那我們就可以構(gòu)建 DAX 表達式了具帮,分組僅用一個度量值博肋,表達式如下:

分組方式 =
VAR CurrentItem =
    SELECTEDVALUE ( '分組表'[組別] )  // 確定所在的組別
VAR LeftValue =
    CALCULATE ( MIN ( '分組表'[最小值] ), '分組表'[組別] = CurrentItem )  //將該組的最小值作為左值
VAR RightValue =
    CALCULATE ( MIN ( '分組表'[最大值] ), '分組表'[組別] = CurrentItem )  //將該組的最大值作為右值
VAR mid_table =
    ADDCOLUMNS (
        VALUES ( '訂單'[產(chǎn)品ID] ),
        "平均銷售額", CALCULATE ( AVERAGE ( '訂單'[銷售額] ) )
    )  // 按照產(chǎn)品ID構(gòu)造一張?zhí)摂M中間表
VAR ItemRange =
    FILTER ( mid_table, [平均銷售額] >= LeftValue && [平均銷售額] < RightValue )  // 過濾出屬于最初選定組別的虛擬表的子集
RETURN
    COUNTROWS ( ItemRange )

可能有些伙伴沒有看明白,我分布說明下:

  1. 由于度量值最終會和組別一起使用蜂厅,那么首先要確定是針對那個組進行統(tǒng)計
VAR CurrentItem =
    SELECTEDVALUE ( '分組表'[組別] ) 
  1. 然后確定了組別匪凡,就需要確定這一組的左值和右值,一邊后面用于計算
VAR LeftValue =
    CALCULATE ( MIN ( '分組表'[最小值] ), '分組表'[組別] = CurrentItem )  
VAR RightValue =
    CALCULATE ( MIN ( '分組表'[最大值] ), '分組表'[組別] = CurrentItem )
  1. 之后構(gòu)造一張?zhí)摂M表掘猿,是按照產(chǎn)品ID銷售額的平均值病游,行為類似上文中使用 SUMMARIZE 構(gòu)造的中間表
VAR mid_table =
    ADDCOLUMNS (
        VALUES ( '訂單'[產(chǎn)品ID] ),
        "平均銷售額", CALCULATE ( AVERAGE ( '訂單'[銷售額] ) )
    )  
  1. 最后要統(tǒng)計出屬于該分組的一個子集,統(tǒng)計其行數(shù)就是產(chǎn)品ID的計數(shù)啦稠通。
VAR ItemRange =
    FILTER ( mid_table, [平均銷售額] >= LeftValue && [平均銷售額] < RightValue ) 
RETURN
    COUNTROWS ( ItemRange )

最后讓我們一起來看看效果礁遵。

P6_最終效果.gif

總結(jié)

最近都在寫分組,但是分組卻是工作中最常用的場景采记。戰(zhàn)友們?nèi)绻泄ぷ髦杏龅降挠腥さ姆纸M需求,歡迎在留言區(qū)留言政勃,我們再交流唧龄,尋找模型驅(qū)動可視化的邊界。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末奸远,一起剝皮案震驚了整個濱河市既棺,隨后出現(xiàn)的幾起案子讽挟,更是在濱河造成了極大的恐慌,老刑警劉巖丸冕,帶你破解...
    沈念sama閱讀 206,214評論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件耽梅,死亡現(xiàn)場離奇詭異,居然都是意外死亡胖烛,警方通過查閱死者的電腦和手機眼姐,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,307評論 2 382
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來佩番,“玉大人众旗,你說我怎么就攤上這事√宋罚” “怎么了贡歧?”我有些...
    開封第一講書人閱讀 152,543評論 0 341
  • 文/不壞的土叔 我叫張陵,是天一觀的道長赋秀。 經(jīng)常有香客問我利朵,道長,這世上最難降的妖魔是什么猎莲? 我笑而不...
    開封第一講書人閱讀 55,221評論 1 279
  • 正文 為了忘掉前任绍弟,我火速辦了婚禮,結(jié)果婚禮上益眉,老公的妹妹穿的比我還像新娘晌柬。我一直安慰自己,他們只是感情好郭脂,可當(dāng)我...
    茶點故事閱讀 64,224評論 5 371
  • 文/花漫 我一把揭開白布年碘。 她就那樣靜靜地躺著,像睡著了一般展鸡。 火紅的嫁衣襯著肌膚如雪屿衅。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,007評論 1 284
  • 那天莹弊,我揣著相機與錄音涤久,去河邊找鬼。 笑死忍弛,一個胖子當(dāng)著我的面吹牛响迂,可吹牛的內(nèi)容都是我干的。 我是一名探鬼主播细疚,決...
    沈念sama閱讀 38,313評論 3 399
  • 文/蒼蘭香墨 我猛地睜開眼蔗彤,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起然遏,我...
    開封第一講書人閱讀 36,956評論 0 259
  • 序言:老撾萬榮一對情侶失蹤贫途,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后待侵,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體丢早,經(jīng)...
    沈念sama閱讀 43,441評論 1 300
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 35,925評論 2 323
  • 正文 我和宋清朗相戀三年秧倾,在試婚紗的時候發(fā)現(xiàn)自己被綠了怨酝。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 38,018評論 1 333
  • 序言:一個原本活蹦亂跳的男人離奇死亡中狂,死狀恐怖凫碌,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情胃榕,我是刑警寧澤盛险,帶...
    沈念sama閱讀 33,685評論 4 322
  • 正文 年R本政府宣布,位于F島的核電站勋又,受9級特大地震影響苦掘,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜楔壤,卻給世界環(huán)境...
    茶點故事閱讀 39,234評論 3 307
  • 文/蒙蒙 一鹤啡、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧蹲嚣,春花似錦递瑰、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,240評論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至议惰,卻和暖如春慎颗,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背言询。 一陣腳步聲響...
    開封第一講書人閱讀 31,464評論 1 261
  • 我被黑心中介騙來泰國打工俯萎, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人运杭。 一個月前我還...
    沈念sama閱讀 45,467評論 2 352
  • 正文 我出身青樓夫啊,卻偏偏與公主長得像,于是被迫代替她去往敵國和親辆憔。 傳聞我的和親對象是個殘疾皇子涮母,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 42,762評論 2 345

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