這篇文章介紹 SQL 如何使用 HAVING
搭配 COUNT
找出重複的資料項目,以及 HAVING
函數和 WHERE
的差異。
列出重複項目
以下的查詢語法,使用 COUNT
找出人員 ID、部門的重複次數 (即相同的數量),依 GROUP BY
將相同欄位分成好幾個群組,再透過 HAVING
列出重複次數大於 1 的資料:
SELECT EmployeeID, Department
FROM EmployeeTable
GROUP BY EmployeeID, Department
HAVING COUNT(*) > 1
假設我們有一個名為 EmployeeTable 的員工表格,資料如下:
EmployeeID | Department |
---|---|
1 | Sales |
2 | HR |
3 | IT |
1 | Sales |
4 | Marketing |
5 | Sales |
3 | IT |
2 | HR |
6 | IT |
7 | Marketing |
1 | Sales |
執行上述的查詢語法後,其結果如下:
EmployeeID | Department |
---|---|
1 | Sales |
2 | HR |
3 | IT |
因為 EmployeeID 1 在 Sales 部門出現了 3 次,2 在 HR 部門出現了 2 次,3 在 IT 部門出現了 2 次,這些都符合重複次數大於 1 的條件,所以會被列出來。
(以下是這組資料在 SQL Server 的建立語法,可以到 SQL Online IDE 等網站測試看看哦!)
-- 建立資料表
CREATE TABLE EmployeeTable (
EmployeeID INT,
Department NVARCHAR(50)
);
-- 產生測試資料
INSERT INTO EmployeeTable (EmployeeID, Department) VALUES
(1, 'Sales'), (2, 'HR'), (3, 'IT'),
(1, 'Sales'), (4, 'Marketing'), (5, 'Sales'),
(3, 'IT'), (2, 'HR'), (6, 'IT'),
(7, 'Marketing'), (1, 'Sales');
HAVING 與 WHERE 的差異
有使用聚合函數 (例如 SUM
, AVG
等等) 計算時,假如想要對計算結果做進一步的篩選,這時不能夠使用 WHERE
查詢,而要使用 HAVING
。
例如以下資料:
EmployeeID | ItemMoney |
---|---|
1 | 500 |
2 | 1000 |
1 | 350 |
- 錯誤的例子
SELECT EmployeeID, SUM(ItemMoney)
FROM ItemValue
GROUP BY EmployeeID
WHERE SUM(ItemMoney) > 1500
- 正確的例子
SELECT EmployeeID, SUM(ItemMoney)
FROM ItemValue
GROUP BY EmployeeID
HAVING SUM(ItemMoney) > 1500
HAVING
通常放在查詢語法的最後方;WHERE
可用在一般非聚合函數的條件查詢,例如:
SELECT EmployeeID, ItemMoney
FROM ItemValue
WHERE EmployeeID = '0001'