跳至內容
Astera Technology

銷售額並列第一,為甚麼只列出一人?

規則是並列第一全部列出時,要用保留並列的排名,而非只取一行。

下載完整個案資料及參考答案 ↓

先準備用來排查的資料

要找的是每組所有最高銷售額同事。ROW_NUMBER 即使同額也只給一行第一。RANK 的排序只用定義並列的銷售額;若在排名內再加員工編號,便又把業務上同額拆開。

以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。

假設輸入:agent_totals
員工組別銷售額(分)
ANorth50000
BNorth50000
CNorth30000
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE agent_totals(agent TEXT PRIMARY KEY,team TEXT,sales_cents INTEGER);
INSERT INTO agent_totals VALUES ('A','North',50000),('B','North',50000),('C','North',30000);

重現錯誤結果,再核對更正

錯誤示範查詢:只用來重現問題
WITH ranked AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY team ORDER BY sales_cents DESC,agent) AS place FROM agent_totals)
SELECT team,agent,sales_cents FROM ranked WHERE place=1 ORDER BY team,agent;
實際執行的錯誤示範結果
組別員工銷售額(分)
NorthA50000
下載可編輯 CSV ↓
更正後的 SQLite 查詢
WITH ranked AS (SELECT *,RANK() OVER(PARTITION BY team ORDER BY sales_cents DESC) AS place FROM agent_totals)
SELECT team,agent,sales_cents FROM ranked WHERE place=1 ORDER BY team,agent;
更正查詢的實際結果
組別員工銷售額(分)
NorthA50000
NorthB50000
下載可編輯 CSV ↓

A 和 B 都是 50000 分,應同列 North 第一。錯誤查詢用編號挑 A,更正後兩人都在。畫面仍可按名稱排序,只是不能用它改變排名。

套用前先測邊界及資料範圍

加入 60000 分的 D,第一只剩 D。此查詢保留並列,並非固定要選兩人。

邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。

新假設副本內的邊界改動
INSERT INTO agent_totals VALUES ('D','North',60000);
改動後再執行更正查詢的實際結果
組別員工銷售額(分)
NorthD60000
下載可編輯 CSV ↓

未計佣金或獎勵資格;作獎勵決定前須確認計入銷售、退貨及期間。

以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。

相關資源