กรองกลุ่มที่มี HAVING
เมื่อคุณได้สร้างกลุ่มที่มีส่วนคําสั่ง GROUP BY คุณสามารถกรองผลลัพธ์เพิ่มเติมได้ ส่วนคําสั่ง HAVING ทําหน้าที่เป็นตัวกรองบนกลุ่ม ซึ่งคล้ายกับวิธีที่ส่วนคําสั่ง WHERE ทําหน้าที่เป็นตัวกรองบนแถวที่ส่งกลับโดยส่วนคําสั่ง FROM
ส่วนคําสั่ง HAVING ช่วยให้คุณสามารถสร้างเงื่อนไขการค้นหาโดยแนวคิดคล้ายกับเพรดิเคตของส่วนคําสั่ง WHERE ซึ่งจะทดสอบแต่ละกลุ่มที่ส่งกลับโดยส่วนคําสั่ง GROUP BY
ตัวอย่างต่อไปนี้นับจํานวนคําสั่งซื้อสําหรับลูกค้าแต่ละราย และกรองผลลัพธ์เพื่อรวมเฉพาะลูกค้าที่มีการสั่งซื้อมากกว่า 10 รายการเท่านั้น:
SELECT CustomerID,
COUNT(*) AS OrderCount
FROM Sales.SalesOrderHeader
GROUP BY CustomerID
HAVING COUNT(*) > 10;
เปรียบเทียบ HAVING กับตําแหน่งที่
ในขณะที่ส่วนคําสั่ง HAVING และ WHERE จะกรองข้อมูล โปรดจําไว้ว่า WHERE ดําเนินการบนแถวที่ส่งกลับโดยส่วนคําสั่ง FROM ถ้า GROUP BY ... ส่วน HAVING มีอยู่ในคิวรีของคุณตามหลังส่วนคําสั่ง WHERE ส่วนคําสั่ง WHERE จะกรองแถวก่อนประมวลผล GROUP BY ซึ่งอาจจํากัดกลุ่มที่สามารถสร้างขึ้นได้
มีการประมวลผลส่วนคําสั่ง HAVING หลังจาก GROUP BY และดําเนินการกับกลุ่มเท่านั้น ไม่ใช่แถวรายละเอียด สรุป:
- ส่วนคําสั่ง WHERE จะกรองแถวก่อนกลุ่มใด ๆ จะถูกสร้างขึ้น
- คําสั่ง HAVING จะกรองทั้งกลุ่ม และมักจะดูผลลัพธ์ของการรวม