StepCoding

การจัดกลุ่มผลลัพธ์ด้วย GROUP BY

อ่าน [4750] หมวดหมู่: คำสั่ง SELECT เบื้องต้น

ในบทความก่อนหน้านี้เราจะเห็นฟังก์ชันในการหาผลรวมแล้ว รวมถึงตัวอย่างวิธีการใช้งานไปบ้างแล้ว ซึ่งในตัวอย่างที่ผ่านมานั้นผมได้ใช้ function เหล่านั้นได้การหาผลรวมของข้อมูลทั้งหมดในตารางนั้น ๆ แต่ในกรณีที่เราต้องการให้มันสรุปโดยจัดกลุ่มให้มันก็จะต้องใช้คำสั่ง GROUP BY

ผมจะสมมติตาราง personnel ขึ้นมาโดยประกอบไปด้วยข้อมูลต่าง ๆ ดังนี้ครับ

SELECT * FROM personnel;
pers_idnamedept_idtitlesalary
1Wendy14Supervisor38000.00
2Wally7Stock clerk28000.00
3Ray7Programmer41000.00
4Burton14Secretary32000.00
5Gordon14President78000.00
6Jeff7Stock clerk29000.00
7Doris7Programmer48000.00
8Daisy7Secretary33000.00
9Bea7Accountant40000.00

ถ้าเราต้องการนับผลลัพธ์โดยไม่ใช้คำสั่ง GROUP BY มันจะรวมเป็นค่าเดียวเท่านั้นดังนี้

SELECT COUNT(*) FROM personnel;
COUNT(*)
9

ถ้าเราเพิ่มคำสั่ง GROUP BY เพื่อต้องการหาจำนวนพนักงานภายในตำแหน่งนั้น ๆ โดยเราจะต้องกำหนด field title เพื่อแสดงตำแหน่งนั้น ๆ และเราจะต้องจัดกลุ่มด้วย field title เช่นกัน

SELECT title, COUNT(*) FROM personnel GROUP BY title;
titleCOUNT(*)
Accountant1
President1
Programmer2
Secretary2
Stock clerk2
Supervisor1

ถ้าเราต้องการนับจำนวนพนักงานแต่ละแผนกจะต้องจัดกลุ่มตาม dept_id ดังนี้

SELECT dept_id, COUNT(*) FROM personnel GROUP BY dept_id;
dept_idCOUNT(*)
76
143

คำสั่ง GROUP BY นั้นสามารถจัดกลุ่มได้หลาย field มันจะทำการจัดกลุ่มของ field ต่าง ๆ นั้นรวมกัน เช่น ถ้าเราต้องการค้นหาจำนวนพนักงานที่อยู่ในแผนกนั้น ๆ และตำแหน่งนั้น ๆ ดังนี้

SELECT dept_id, title, COUNT(*) FROM personnel
GROUP BY dept_id, title;
dept_idtitleCOUNT(*)
7Accountant1
7Programmer2
7Secretary1
7Stock clerk2
14President1
14Secretary1
14Supervisor1

นอกจาก COUNT() แล้ว เรายังสามารถใช้ function อื่น ๆ ได้อีกด้วย เช่น ต้องการดูจำนวนเงินเดือนต่ำสุด, จำนวนเงินเดือนสูงสุด และค่าเฉลี่ยนเงินเดือน ในแต่ละตำแหน่ง (title) จะต้องใช้คำสั่งดังนี้

SELECT title, MIN(salary), MAX(salary), AVG(salary)
FROM personnel
GROUP BY title;
titleMIN(salary)MAX(salary)AVG(salary)
Accountant40000.0040000.0040000.000000
President78000.0078000.0078000.000000
Programmer41000.0048000.0044500.000000
Secretary32000.0033000.0032500.000000
Stock clerk28000.0029000.0028500.000000
Supervisor38000.0038000.0038000.000000

ถ้าต้องการดูจำนวนเงินเดือนต่ำสุด, จำนวนเงินเดือนสูงสุด และค่าเฉลี่ยนเงินเดือน ในแต่ละแผนก (dept_id) จะต้องใช้คำสั่งดังนี้

SELECT dept_id, MIN(salary), MAX(salary), AVG(salary)
FROM personnel
GROUP BY dept_id;
dept_idMIN(salary)MAX(salary)AVG(salary)
728000.0048000.0036500.000000
1432000.0078000.0049333.333333

ผู้สนับสนุน