🧾SQL 教學:如何列出資料表欄位的「不同值」— 新手也能懂的 DISTINCT 與 GROUP BY
1. 這篇文章要解決什麼問題?
你在資料庫裡有一張資料表(例如測試資料、報表資料、或任何紀錄表),其中有一個欄位叫做 RAWFILE,它通常代表「資料從哪個檔案匯入」或「來源檔名」。
你想做的事情很常見:
把 RAWFILE 欄位中出現過的「不同值」全部列出來
這個需求通常用在:
-
找出有哪些來源檔案有被匯入
-
檢查資料異常時,快速定位「哪些檔案」可能有問題
-
做資料清理前先確認來源分佈
-
寫 ETL / Loader 時做追蹤與稽核(audit)
2. 先用白話理解:「不同值」是什麼?
假設 RAWFILE 欄位的資料長得像這樣:
| RAWFILE |
|---|
| fileA.xlsx |
| fileA.xlsx |
| fileB.xlsx |
| fileC.xlsx |
| fileB.xlsx |
你要的輸出是:
-
fileA.xlsx
-
fileB.xlsx
-
fileC.xlsx
也就是 去重複後的清單。
3. 最常用解法:DISTINCT(去重複)
在 SQL 裡,最直覺的作法是用
DISTINCT。
它的意思就是:只顯示不重複的值
✅ 示範 SQL:
SELECT DISTINCT
t.RAWFILE
FROM dbo.FT_TEST_INFO AS t
WHERE t.RAWFILE IS NOT NULL
ORDER BY t.RAWFILE;
你會得到一份「RAWFILE 不同值清單」,並且用
ORDER BY
讓它排序,方便閱讀與比對。
4. 只看某種「異常」資料來源(加上條件)
很多時候你不是要列出全部檔名,而是要找:
哪些來源檔案,產生了某種異常的欄位值?
例如某些欄位(像日期碼、狀態碼)可能出現奇怪符號或特殊字串,你會想先抓出「是哪幾個檔案造成的」。
✅ 示範 SQL:
SELECT DISTINCT
t.RAWFILE
FROM dbo.FT_TEST_INFO AS t
WHERE t.RAWFILE IS NOT NULL
AND (
t.DATE_CODE LIKE N'%特殊符號%'
OR t.DATE_CODE LIKE N'%特定字樣%'
)
ORDER BY t.RAWFILE;
📌 重點說明:
-
LIKE '%...%'表示「包含某段文字」 -
N'...'用在可能有中文/特殊字元的情境(避免字元集問題) -
把條件放在
WHERE,就能讓結果只針對「異常資料的來源檔案」
5. 想知道影響範圍:每個 RAWFILE 有幾筆資料?
只列清單有時不夠,工程師常常還需要知道:
「這個檔案影響多少筆資料?是不是只影響少數,還是大量?」
✅ 示範 SQL:
SELECT
t.RAWFILE,
COUNT(1) AS RowCount
FROM dbo.FT_TEST_INFO AS t
WHERE t.RAWFILE IS NOT NULL
GROUP BY t.RAWFILE
ORDER BY RowCount DESC;
你會得到像這樣的結果:
| RAWFILE | RowCount |
|---|---|
| fileA.xlsx | 1200 |
| fileB.xlsx | 350 |
| fileC.xlsx | 20 |
這對排查非常有用,因為你可以優先處理影響最大的一批。
6. 工程師實務建議:為什麼這招很重要?
在真實專案裡,資料表很大、來源很多、異常也很多。
列出來源欄位的不同值通常是第一步,因為它可以:
-
快速做「來源盤點」
-
快速找出「異常集中在哪些檔案」
-
提供後續修復策略,例如:
-
重新匯入特定檔案
-
對特定檔案來源做解析規則修正
-
對特定來源加入資料驗證(validation)
-
7. 常見踩雷與排錯
(1) RAWFILE 有空值
建議一定要加
RAWFILE IS NOT NULL,不然你會看到一行空值,干擾判斷。
(2) 檔名大小寫不同導致重複
有些資料庫 collation 會把
FileA.xlsx 與
filea.xlsx 當不同值。
如果你想把它們視為同一個,可以用
UPPER() 或
LOWER() 做統一(視情況使用)。
✅ 示範 SQL:
SELECT DISTINCT
UPPER(t.RAWFILE) AS RAWFILE_Normalized
FROM dbo.FT_TEST_INFO AS t
WHERE t.RAWFILE IS NOT NULL
ORDER BY RAWFILE_Normalized;
8. 結論
如果你只想「列出欄位的不同值」,最簡單就是:
-
✅
SELECT DISTINCT 欄位 FROM 表
如果你還想知道「每個值出現幾次」,就用:
-
✅
GROUP BY 欄位 + COUNT(*)
而在資料異常排查時,最常用的組合就是:
-
✅
DISTINCT + WHERE 條件
用來找出「異常是從哪些來源檔案來的」。
你可以直接套用的「快速模板」(可複製)
模板 1:列出不同值
SELECT DISTINCT
t.<YourColumn>
FROM dbo.<YourTable> AS t
WHERE t.<YourColumn> IS NOT NULL
ORDER BY t.<YourColumn>;
模板 2:列出不同值 + 統計數量
SELECT
t.<YourColumn>,
COUNT(1) AS Cnt
FROM dbo.<YourTable> AS t
WHERE t.<YourColumn> IS NOT NULL
GROUP BY t.<YourColumn>
ORDER BY Cnt DESC;
留言
張貼留言