看商店轉換率時,社群帶來 50 次造訪卻沒有訂單,轉換率可以寫 0%。但電子報當天連一次造訪都沒有,這一列就沒有可用的分母。如果兩列都顯示 0%,接手報表的人看不出應該檢查結帳流程,還是先查流量資料。
在分母使用 NULLIF,保留無法計算的狀態
NULLIF(visits, 0) 會在造訪數等於 0 時回傳 NULL,其他情況保留造訪數。分母是 NULL 時,比率也會是 NULL。若造訪數原本就沒收集到,查詢也不會把它變成零。下面是可直接在 MySQL 8.4 執行的四筆示例,無須建立表格。
WITH traffic AS (
SELECT 'search' AS channel, 200 AS visits, 8 AS orders
UNION ALL SELECT 'social', 50, 0
UNION ALL SELECT 'email', 0, 0
UNION ALL SELECT 'partner', NULL, 0
)
SELECT channel, visits, orders,
ROUND(100.0 * orders / NULLIF(visits, 0), 2) AS rate_pct
FROM traffic
ORDER BY channel;
搜尋有 200 次造訪、8 筆訂單,算出 4.00。社群有 50 次造訪、0 筆訂單,算出 0.00。電子報和合作渠道的比率都是 NULL,但從 visits 還能分辨前者是零造訪,後者是缺資料。百分比欄位已乘以 100,畫面只需在數字後加上百分號。
畫面可以顯示破折號,匯出的資料仍保留 NULL
讓報表前端把 NULL 顯示為「—」,並保留造訪數欄。這樣站長匯出資料時還能看出哪些列有實際比率。若上來就用 COALESCE(rate_pct, 0),缺資料和真正的 0% 會變成同一個數值,後續計算平均值時也會一起算進去。
合計轉換率用總訂單除以總造訪
若報表只合計已知造訪數的渠道,分子與分母都應來自同一批資料。假設剛才的四筆資料已在 traffic 中,可將前面查詢的最後一段換成以下寫法。
SELECT ROUND(
100.0 * SUM(orders) / NULLIF(SUM(visits), 0), 2
) AS total_rate_pct
FROM traffic
WHERE visits IS NOT NULL;
例子中已知造訪數合計 250,訂單共 8 筆,轉換率是 3.20%。如果先把搜尋的 4% 和社群的 0% 平均,會得到 2%,相當於讓兩個流量差很多的渠道各占一半。若資料出現「零造訪但有訂單」,先核對兩項指標的來源和日期範圍,再決定是否納入合計。
封面為 AI 生成的概念插畫。
參考資料
原文鏈接:https://wntheme.com/mysql-nullif-zero-denominator/,轉載請註明出處。
