非典型的樞紐,卻常讓人頭疼的問題 — 用PowerQuery與DAX轉置Table。
前言
最近有追蹤power bi community的RSS,因此有空就會看看。而今天碰巧就遇到一個之前遇到,但一直在意的案例。
之前同事也有類似的Table,希望我能夠協助轉換。那時我是用挺暴力的方法,用Excel的indirect還是offset、index的方式,再加上移除重複做出來了。
而這次看到這案例,就忍不住想來試試看啦!
首先是用PowerQuery。
這部分需要對 M language有點認識才比較好做起來,因為會運用到大量的Table.公式
- 以[Product]做群組,形成Table。
- 以Table.Min抓取[群組Table]中最小值的”Price”。
- 展開[最小值欄位]後,再撰寫公式新增欄位[Best Seller],Filter Table以取得所需的資料列(rows)。
let BestPrice = [最小值欄位]
in Table.SelectRows([群組Table], each [Price] = BP)
/這裡的[Price]為[群組Table]這個[資料行]的Table/
/因為已經被公式指定欄位與Table,所以不用如前面,抓取時是以double quote來做參照/ - 之後再新增資料行,以Table.SelectColumns([Best Seller],”Seller”)抓取所要的seller資訊。
- 以Table.Transpose,將seller的資料行轉列。
最後再以Table.ToList與Combiner.並用,組合[Seller]的資料行。
另一種方法,是以DAX撰寫。
SUMMARIZE (‘table’, ‘table’[Product], “產品編號”,
CONCATENATEX (
TOPN ( 1,
VALUES ( ‘table’[Seller] ),
CALCULATE ( MIN ( ‘table’[Price] ) ),
ASC
),
‘table’[Seller],
“,”
)
)
這裡重點是,以TOPN將Values(seller)作為table,抓取Price為最小值的seller。最終在以Concatenatex來串seller欄位。
看完真的要仔細消化,並查找資料熟悉相關的函數呢(笑)!
後記
其實本文也只紹大致理解該篇文章解法,並抄一抄。偶爾試著自己盲寫而非臨摹,試圖消化吸收。
雖然本文一定難以讓看的人,更容易理解語法中的內容。但還是因為自己經過這次的練習,能更了解M與部分的DAX,所以想寫下來。