先準備用來排查的資料
一位同事可以有多項技能,連接後每行代表技能分配,已不是一個人。按組別計不重複員工編號,沒有技能資料的同事也保留,不能因培訓紀錄未齊而少計人手。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 編號 | 組別 |
|---|---|
| S1 | Ops |
| S2 | Ops |
| S3 | Sales |
| 員工編號 | 技能 |
|---|---|
| S1 | packing |
| S1 | receiving |
| S2 | packing |
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;| 組別 | 人數 |
|---|---|
| Ops | 3 |
| Sales | 1 |
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;| 組別 | 人數 |
|---|---|
| Ops | 2 |
| Sales | 1 |
Ops 有兩人、三筆技能;Sales 有一人,但未記技能。錯誤查詢把 Ops 計成三人,更正後是兩人及一人。計不重複技能只會回答另一個問題,仍不是人數。
套用前先測邊界及資料範圍
替 S1 加第三項技能,人數仍是兩人,因為沒有新增同事。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO skills VALUES ('S1','returns');| 組別 | 人數 |
|---|---|
| Ops | 2 |
| Sales | 1 |
這是名冊人數,未計可用工時或全職等值;入職日期及轉組要另訂規則。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。