先準備用來排查的資料
一筆掃碼是登記事件,不一定是另一位出席者。每節課計不重複會員編號,同一人去另一節則再次計。若整個匯出只按會員去重,會少計之後的課節。
以下完整建表及資料只在新的 SQLite 測試資料庫執行。全部紀錄均為假設,數量以件計,輸入的 cents 金額欄以貨幣的分存整數;計算後的平均數可能不足整分。小型例子的各表均完整列在預覽。
| 編號 | 課節編號 | 會員編號 |
|---|---|---|
| 1 | A | M1 |
| 2 | A | M1 |
| 3 | A | M2 |
| 4 | B | M1 |
CREATE TABLE scans(id INTEGER PRIMARY KEY,session_id TEXT,member_id TEXT);
INSERT INTO scans VALUES (1,'A','M1'),(2,'A','M1'),(3,'A','M2'),(4,'B','M1');重現錯誤結果,再核對更正
SELECT session_id,COUNT(*) AS attendees FROM scans GROUP BY session_id ORDER BY session_id;| 課節編號 | 出席人數 |
|---|---|
| A | 3 |
| B | 1 |
SELECT session_id,COUNT(DISTINCT member_id) AS attendees FROM scans GROUP BY session_id ORDER BY session_id;| 課節編號 | 出席人數 |
|---|---|
| A | 2 |
| B | 1 |
A 有三次掃碼,但只有兩人;B 有一人。更正後是兩人及一人。M1 的重複掃碼仍保留,可再查是裝置重試還是同事更正。
套用前先測邊界及資料範圍
A 再加入 M1 的掃碼,人數仍是兩人;若是新會員才增加,所以識別是會員加課節,不是事件數。
邊界測試要另開新的假設資料庫,重做完整建表及資料,只套用以下改動,再執行更正查詢。測試改動不可用於正式系統。
INSERT INTO scans VALUES (5,'A','M1');| 課節編號 | 出席人數 |
|---|---|
| A | 2 |
| B | 1 |
空會員編號會被 COUNT(DISTINCT) 略過,須另查;離場及缺席規則未包括在內。
以上錯誤、更正及邊界結果都已在 SQLite 執行,並與另行編寫的預期資料逐行核對。證據只適用於這組假設條件,未測其他資料庫、正式效能或你的現有資料結構。