🧾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. 工程師實務建議:為什麼這招很重要?

在真實專案裡,資料表很大、來源很多、異常也很多。
列出來源欄位的不同值通常是第一步,因為它可以:

  1. 快速做「來源盤點」

  2. 快速找出「異常集中在哪些檔案」

  3. 提供後續修復策略,例如:

    • 重新匯入特定檔案

    • 對特定檔案來源做解析規則修正

    • 對特定來源加入資料驗證(validation)


7. 常見踩雷與排錯

(1) RAWFILE 有空值

建議一定要加 RAWFILE IS NOT NULL,不然你會看到一行空值,干擾判斷。

(2) 檔名大小寫不同導致重複

有些資料庫 collation 會把 FileA.xlsxfilea.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;

留言

這個網誌中的熱門文章

🔍Vue.js 專案錯誤排查:解決 numericFields is not defined 與合併儲存格邏輯最佳化

🖥️遠端桌面連線完整新手指南:Windows RDP、Chrome Remote Desktop、AnyDesk、TeamViewer 一次搞懂

🔎EF Core 連 Oracle 出現 ORA-00600 [kpp_concatq:2] 的完整排錯指南(含 EF Core ToString/CultureInfo 錯誤)