🐬Spotfire 報表的 BIN 為什麼顯示不出來?0.00 一堆、選兩個 Lot 只剩一個的完整排查指南(含 SQL 與 IronPython 思路)

內容

一、你看到的現象其實很典型:BIN 不見、(Empty) 出現、0.00 很多、選兩個 Lot 卻只剩一個

很多人第一次在 Spotfire 做 Yield / BIN 報表會遇到類似狀況:

  1. Yield Summary 表格應該要有 BIN1、BIN5、BIN36…,結果完全沒出現

  2. 表格或 Pivot 後的欄位出現 (Empty)

  3. BIN 欄位很多都顯示 0.00,看起來像「資料明明篩掉了 0,怎麼還是 0?」

  4. 明明選了兩筆(兩個 Lot),結果最後只剩一筆出現在 Yield Summary

這些問題看似四散,但本質都可以用「資料處理管線」的概念一次理解。


二、先用最簡單的比喻:Spotfire 就像一台「多段加工機」

你可以把整個流程想成:

  • 資料庫(SQL):把原料(資料)運進來

  • Spotfire 的 Join/Pivot:把原料組裝成你要的形狀

  • 視覺化(Table/Chart):把結果畫成表格與圖表

  • 互動(Marking/Filtering):你點了圖,其他視覺會跟著變

只要其中一段「加工」做錯,就會出現你看到的怪狀況。


三、最重要的核心:為什麼會出現 (Empty)?

Spotfire 的 Pivot 常見邏輯是:

  • 你指定「分類欄位」當作 Pivot 後的欄名來源

  • 如果那個分類欄位是空的(Null/空字串),Spotfire 就會把它統一歸類成 (Empty)

✅ 直覺理解

  • 你想要欄位叫:BIN1、BIN2、BIN36

  • 但你用來命名的那個欄位是空的

  • Spotfire 只好產生一個叫 (Empty) 的欄位

常見原因(最常見)

你用 Join 把 BIN 名稱(例如 “BIN36”)拼進來,但 Join key 對不上,導致名稱欄位全變空。


四、為什麼 SQL 已經過濾掉 0,畫面還是 0.00?

這也是新手最容易誤會的地方。

✅ 觀念:0.00 不一定代表「資料庫裡有 0」

它可能是:

  1. Pivot 後缺值(原本是空)被格式化成 0.00

  2. 上面表格顯示的是「比率」,下面圖顯示的是「計數」或「百分比」,兩邊不是同一個數字

  3. 小數位與四捨五入:0.004 可能顯示成 0.00、0.006 顯示成 0.01

所以:SQL 的 COUNT > 0 只能保證「計數不是 0」,但不保證「比率顯示不是 0.00」。



五、為什麼選兩個 Lot 最後只剩一個?

這通常不是使用者真的沒選到,而是資料處理時被「合併」或被「刪掉」。

典型原因 1:Join 用了「不夠唯一」的欄位當 Key

例如有人會用「檔名」或「某個描述欄位」當 Key,但兩筆資料剛好一樣,結果 Join 只匹配到一筆。

典型原因 2:Join 設定是「只取第一筆匹配」

有些 Join 模式是「左表只取單筆匹配」,遇到重複 Key 就可能只保留其中一筆。

典型原因 3:你後面又做了「刪除空值列」

如果其中一筆在 Join 後某欄位變成空,後面又有「空值就刪除」,那筆就消失了。


六、工程師排查 SOP:用 3 個問題快速定位

1)Pivot 的分類欄位是不是空?

如果分類欄位空 → 就會看到 (Empty) → BIN 欄就不會出現

2)表格跟圖表到底看的是不是同一種數字?

表格可能顯示「比率」,圖表顯示「計數」

3)資料列數量有沒有被刪到 0?

很多人以為是 SQL 沒資料,其實是「Spotfire 自己刪掉了」。


七、示範:用「安全範例」重寫一個不含隱私的流程(SQL + IronPython 思路)

(A)SQL:先在資料庫端把「沒有意義的 0」排除

SELECT t.session_id, t.bin_id, t.site_id, t.bin_count FROM dbo.sample_bin_summary t WITH (NOLOCK) WHERE t.session_id IN ('S001','S002') AND t.bin_count > 0;

效果:

  • 從源頭只拉「有出現的 BIN」

  • 這樣 Pivot 時不會憑空出現一堆 0 的 bin 記錄


(B)Spotfire/IronPython:先建立「真正的欄名」,避免 (Empty)

如果你不想依賴「外部 join 來的 BIN 名稱」,可以先自己拼出欄名(避免 join 失敗就全空):

# 示範:把 bin_id 轉成 "BINxx" 字串當作 pivot 欄名來源 tbl = Document.Data.Tables["Stage_BinDetail"] cols = tbl.Columns if "BIN_LABEL" in [c.Name for c in cols]: cols.Remove("BIN_LABEL") cols.AddCalculatedColumn("BIN_LABEL", "Concatenate('BIN', String([bin_id]))")

效果:

  • 你 Pivot 的分類欄位不會空

  • 就算 join 失敗,你仍能看到 BIN1/BIN36 這些欄位


(C)Spotfire:Pivot 時用 BIN_LABEL 當分類欄位

概念上是:

  • Identity:session_id、lot、時間…

  • Category:BIN_LABEL

  • Value:bin_count 或 rate

這樣 Pivot 結果才會穩定產生 BINxx 欄位。


八、互動造成的「看起來怪」:為什麼上表會被下圖影響?

Spotfire 預設會做「互動連動」:

  • 你點了 Pareto 圖上的某個 BIN

  • 上面的表格也會跟著只顯示那個 BIN 的相關資料

  • 這叫 Marking/Filtering 同步

✅ 解法:
在表格的 Properties 裡,把 Marking 設為 None 或另一個 Marking,避免表格被圖表選取影響。


九、常見問題 FAQ

Q1:我 SQL 已經加了 bin_count > 0,為什麼表格還是看到 0.00?

A:因為表格顯示可能是「比率」且經過四捨五入,0.004 會顯示 0.00。請把顯示小數位調大,或檢查表格/圖表看的欄位是不是同一個。

Q2:為什麼 Pivot 後只出現 (Empty)?

A:你用來當「欄名來源」的分類欄位是空值(通常是 join 失敗或欄位型別不一致)。改用自己拼出的 BIN_LABEL 或檢查 join key。

Q3:選兩筆 Lot 為什麼只剩一筆?

A:通常是 join key 重複 + 單筆匹配 join 模式導致只保留一筆,或後面「空值刪除」把其中一筆刪掉。

Q4:工程師最快的排查方式是什麼?

A:先印 RowCount(資料列數),再檢查 Pivot 的分類欄位是否為空,最後確認表格/圖表用的是同一個欄位與聚合方式。


十、結語:Spotfire 的問題多半不是「SQL 錯」,而是「資料管線某段不一致」

當你遇到 BIN 不見、(Empty)、0.00 很多、兩筆只剩一筆時,建議照這個順序查:

  1. Pivot 的分類欄位是否空?

  2. Join key 是否唯一且型別一致?

  3. 是否有「空值刪除」把資料刪掉?

  4. 表格與圖表是否在看同一個欄位/同一種聚合?

  5. Marking 是否造成視覺連動?

只要按這個工程師 SOP 走,通常 30 分鐘內就能定位根因。

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)