ในบทความก่อนหน้านี้เราจะเห็นฟังก์ชันในการหาผลรวมแล้ว รวมถึงตัวอย่างวิธีการใช้งานไปบ้างแล้ว ซึ่งในตัวอย่างที่ผ่านมานั้นผมได้ใช้ function เหล่านั้นได้การหาผลรวมของข้อมูลทั้งหมดในตารางนั้น ๆ แต่ในกรณีที่เราต้องการให้มันสรุปโดยจัดกลุ่มให้มันก็จะต้องใช้คำสั่ง GROUP BY
ผมจะสมมติตาราง personnel ขึ้นมาโดยประกอบไปด้วยข้อมูลต่าง ๆ ดังนี้ครับ
SELECT * FROM personnel;
| pers_id | name | dept_id | title | salary |
|---|---|---|---|---|
| 1 | Wendy | 14 | Supervisor | 38000.00 |
| 2 | Wally | 7 | Stock clerk | 28000.00 |
| 3 | Ray | 7 | Programmer | 41000.00 |
| 4 | Burton | 14 | Secretary | 32000.00 |
| 5 | Gordon | 14 | President | 78000.00 |
| 6 | Jeff | 7 | Stock clerk | 29000.00 |
| 7 | Doris | 7 | Programmer | 48000.00 |
| 8 | Daisy | 7 | Secretary | 33000.00 |
| 9 | Bea | 7 | Accountant | 40000.00 |
ถ้าเราต้องการนับผลลัพธ์โดยไม่ใช้คำสั่ง GROUP BY มันจะรวมเป็นค่าเดียวเท่านั้นดังนี้
SELECT COUNT(*) FROM personnel;
| COUNT(*) |
|---|
| 9 |
ถ้าเราเพิ่มคำสั่ง GROUP BY เพื่อต้องการหาจำนวนพนักงานภายในตำแหน่งนั้น ๆ โดยเราจะต้องกำหนด field title เพื่อแสดงตำแหน่งนั้น ๆ และเราจะต้องจัดกลุ่มด้วย field title เช่นกัน
SELECT title, COUNT(*) FROM personnel GROUP BY title;
| title | COUNT(*) |
|---|---|
| Accountant | 1 |
| President | 1 |
| Programmer | 2 |
| Secretary | 2 |
| Stock clerk | 2 |
| Supervisor | 1 |
ถ้าเราต้องการนับจำนวนพนักงานแต่ละแผนกจะต้องจัดกลุ่มตาม dept_id ดังนี้
SELECT dept_id, COUNT(*) FROM personnel GROUP BY dept_id;
| dept_id | COUNT(*) |
|---|---|
| 7 | 6 |
| 14 | 3 |
คำสั่ง GROUP BY นั้นสามารถจัดกลุ่มได้หลาย field มันจะทำการจัดกลุ่มของ field ต่าง ๆ นั้นรวมกัน เช่น ถ้าเราต้องการค้นหาจำนวนพนักงานที่อยู่ในแผนกนั้น ๆ และตำแหน่งนั้น ๆ ดังนี้
SELECT dept_id, title, COUNT(*) FROM personnel GROUP BY dept_id, title;
| dept_id | title | COUNT(*) |
|---|---|---|
| 7 | Accountant | 1 |
| 7 | Programmer | 2 |
| 7 | Secretary | 1 |
| 7 | Stock clerk | 2 |
| 14 | President | 1 |
| 14 | Secretary | 1 |
| 14 | Supervisor | 1 |
นอกจาก COUNT() แล้ว เรายังสามารถใช้ function อื่น ๆ ได้อีกด้วย เช่น ต้องการดูจำนวนเงินเดือนต่ำสุด, จำนวนเงินเดือนสูงสุด และค่าเฉลี่ยนเงินเดือน ในแต่ละตำแหน่ง (title) จะต้องใช้คำสั่งดังนี้
SELECT title, MIN(salary), MAX(salary), AVG(salary) FROM personnel GROUP BY title;
| title | MIN(salary) | MAX(salary) | AVG(salary) |
|---|---|---|---|
| Accountant | 40000.00 | 40000.00 | 40000.000000 |
| President | 78000.00 | 78000.00 | 78000.000000 |
| Programmer | 41000.00 | 48000.00 | 44500.000000 |
| Secretary | 32000.00 | 33000.00 | 32500.000000 |
| Stock clerk | 28000.00 | 29000.00 | 28500.000000 |
| Supervisor | 38000.00 | 38000.00 | 38000.000000 |
ถ้าต้องการดูจำนวนเงินเดือนต่ำสุด, จำนวนเงินเดือนสูงสุด และค่าเฉลี่ยนเงินเดือน ในแต่ละแผนก (dept_id) จะต้องใช้คำสั่งดังนี้
SELECT dept_id, MIN(salary), MAX(salary), AVG(salary) FROM personnel GROUP BY dept_id;
| dept_id | MIN(salary) | MAX(salary) | AVG(salary) |
|---|---|---|---|
| 7 | 28000.00 | 48000.00 | 36500.000000 |
| 14 | 32000.00 | 78000.00 | 49333.333333 |
ผู้สนับสนุน