非典型的樞紐,卻常讓人頭疼的問題 — 用PowerQuery與DAX轉置Table。

Frank Lin TY
3 min readAug 8, 2018

--

前言

最近有追蹤power bi community的RSS,因此有空就會看看。而今天碰巧就遇到一個之前遇到,但一直在意的案例。

之前同事也有類似的Table,希望我能夠協助轉換。那時我是用挺暴力的方法,用Excel的indirect還是offset、index的方式,再加上移除重複做出來了。

而這次看到這案例,就忍不住想來試試看啦!

首先是用PowerQuery。
這部分需要對 M language有點認識才比較好做起來,因為會運用到大量的Table.公式

  1. 以[Product]做群組,形成Table。
  2. 以Table.Min抓取[群組Table]中最小值的”Price”。
  3. 展開[最小值欄位]後,再撰寫公式新增欄位[Best Seller],Filter Table以取得所需的資料列(rows)。
    let BestPrice = [最小值欄位]
    in Table.SelectRows([群組Table], each [Price] = BP)
    /這裡的[Price]為[群組Table]這個[資料行]的Table/
    /因為已經被公式指定欄位與Table,所以不用如前面,抓取時是以double quote來做參照/
  4. 之後再新增資料行,以Table.SelectColumns([Best Seller],”Seller”)抓取所要的seller資訊。
  5. 以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,所以想寫下來。

--

--

No responses yet