跳至內容
Astera Technology

接上技能資料後,組別人數為甚麼多了?

人手總覽要計同事,不是計每位同事有多少項技能。

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

先準備用來排查的資料

一位同事可以有多項技能,連接後每行代表技能分配,已不是一個人。按組別計不重複員工編號,沒有技能資料的同事也保留,不能因培訓紀錄未齊而少計人手。

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

假設輸入:staff
編號組別
S1Ops
S2Ops
S3Sales
下載可編輯 CSV ↓
假設輸入:skills
員工編號技能
S1packing
S1receiving
S2packing
下載可編輯 CSV ↓
可直接執行的完整測試資料
CREATE TABLE staff(id TEXT PRIMARY KEY,team TEXT);
CREATE TABLE skills(staff_id TEXT,skill TEXT);
INSERT INTO staff VALUES ('S1','Ops'),('S2','Ops'),('S3','Sales');
INSERT INTO skills VALUES ('S1','packing'),('S1','receiving'),('S2','packing');

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

錯誤示範查詢:只用來重現問題
SELECT s.team,COUNT(*) AS headcount FROM staff s
LEFT JOIN skills k ON k.staff_id=s.id GROUP BY s.team ORDER BY s.team;
實際執行的錯誤示範結果
組別人數
Ops3
Sales1
下載可編輯 CSV ↓
更正後的 SQLite 查詢
SELECT s.team,COUNT(DISTINCT s.id) AS headcount FROM staff s
LEFT JOIN skills k ON k.staff_id=s.id GROUP BY s.team ORDER BY s.team;
更正查詢的實際結果
組別人數
Ops2
Sales1
下載可編輯 CSV ↓

Ops 有兩人、三筆技能;Sales 有一人,但未記技能。錯誤查詢把 Ops 計成三人,更正後是兩人及一人。計不重複技能只會回答另一個問題,仍不是人數。

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

替 S1 加第三項技能,人數仍是兩人,因為沒有新增同事。

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

新假設副本內的邊界改動
INSERT INTO skills VALUES ('S1','returns');
改動後再執行更正查詢的實際結果
組別人數
Ops2
Sales1
下載可編輯 CSV ↓

這是名冊人數,未計可用工時或全職等值;入職日期及轉組要另訂規則。

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

相關資源