SQL SELECT GROUP BY and
HAVING
วลี GROUP BY จะถูกใช้เมื่อต้องการจัดกลุ่มที่ถูกคำนวณด้วย
aggregate function ซึ่ง
aggregate function คือฟังก์ชั่นที่ใช้ในการคำนวณค่าของข้อมูลหลายๆ
คอลัมน์และคืนค่าอกมาเพียงค่าเดียวโดย aggregate
function มีฟังก์ชั่นต่างๆ
ดังนี้
aggregate
function |
คำอธิบาย |
AVG |
ใช้ในการหาค่าเฉลี่ยในคอลัมน์ที่กำหนด |
MAX |
หาค่าสูงสุดในคอลัมน์ที่กำหนด |
MIN |
หาค่าต่ำสุดในคอลัมน์ที่กำหนด |
SUM |
หาผลรวมในคอลัมน์ที่กำหนด |
COUNT |
นับจำนวนแถวในคอลัมน์ที่กำหนด |
STDEV |
หาค่าส่วนเบี่ยงเบนมาตรฐาน |
STDEVP |
หาค่าส่วนเบี่ยงเบนฐานนิยม |
VAR |
หาค่าความแปรปรวน |
VARP |
หาค่าความแปรปรวนฐานนิยม |
|
|
ซึ่งผมจะยกตัวอย่างให้ดูเพื่อความเข้าใจง่ายๆกันนิดนึงดังนี้
test_group_by.asp
strSQL = "SELECT Profile_ID, Profile_Name, Profile_Age "
strSQL = strSQL & "FROM Profile"
strSQL = strSQL & "WHERE
Profile_ID >= 5 AND Profile_ID <= 8 "
strSQL = strSQL &
" ORDER BY Profile_ID ASC;"
|
|
จากคำสั่งด้านบนเป็นการเลือกค่าฟิลด์ Profile_ID,
Profile_Name, Profile_Age ในตาราง Profile โดยมีข้อกำหนดว่า ค่าที่แสดงนั้นต้องเป็นค่าที่
Profile_ID น้อยกว่าหรือเท่ากับ 5 และ
Profile_ID มากกว่าหรือเท่ากับ 8 ดังนั้นค่าที่แสดงออกมาจะอยู่ในช่วงของ
Profile_ID ที่ 5 - 8 และเรียงลำดับจากน้อยไปหามากตาม
Profile_ID ซึ่งจะได้ผลดังนี้
Profile_ID |
Profile_Name |
Profile_Age |
|
5 |
user5
|
34 |
6 |
user6
|
36 |
7 |
user7
|
23 |
8 |
user8
|
26 |
|
|
แต่ถ้าเราต้องการที่จะดูผลรวมทั้งหมดของอายุในฟิลด์ Profile_Age เราสามารถเขียนคำสั่งได้ใหม่ดังนี้
strSQL = "SELECT SUM(Profile_Age) As ผลรวมของอายุ "
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL & "WHERE Profile_ID >= 5 AND Profile_ID <= 8
" |
|
จากคำสั่งด้านบนเป็นการเลือกค่าฟิลด์ Profile_Age
ในตาราง Profile โดยเปลี่ยนชื่อฟิลด์
Profile_Age เป็น ผลรวมของอายุ เพราะว่าค่าที่คืนกลับมามีเพียงค่าเดียวจึงต้องทำการเปลี่ยนชื่อให้ใหม่มิเช่นนั้นคำสั่งจะเกิดการ
Error และมีข้อกำหนดว่า ค่าที่แสดงนั้นต้องเป็นค่าที่
Profile_ID น้อยกว่าหรือเท่ากับ 5 และ
Profile_ID มากกว่าหรือเท่ากับ 8 ดังนั้นค่าที่แสดงออกมาจะอยู่ในช่วงของ
Profile_ID ที่ 5 - 8 ซึ่งจะได้ผลดังนี้
ทีนี้มาดูอีก 2 ตัวอย่างนะครับการใช้ aggregate
function แต่สามารถแสดงค่าออกมาได้มากกว่า
1 ค่าจากเดิมที่ผมบอกไปว่าค่าที่ถูกคำนวณด้วย aggregate function จะคืนออกมาเพียงค่าเดียวซึ่งก็คือค่าที่คำนวณแล้วแต่เราสามารถที่จะให้แสดงหลายค่าได้โดยต้องมีฟิลด์ตัวหนึ่งที่เป็นฟิลด์หลักของการคำนวณและฟิลด์อีกตัวที่ถูกคำนวณโดยการใช้วลี
GROUP BY หรือ HAVING
ดังนี้
ตัวอย่างที่
1
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL & "GROUP
BY Profile_Location" |
|
จากคำสั่งด้านบนเป็นการเลือกค่าฟิลด์ Profile_Location,
Profile_Age ในตาราง Profile โดยเปลี่ยนชื่อฟิลด์
Profile_Age เป็น ผลรวมของอายุ ซึ่งการแสดงผละเป็นการรวมค่าอายุของฟิลด์
Profile_Location ที่มีค่าเหมือนกัน ซึ่งจะได้ผลดังนี้
Profile_Location |
ผลรวมของอายุ |
|
Bangkok |
34 |
Hongkong |
158 |
Jagata |
52 |
London |
30 |
|
|
ตัวอย่างที่
2
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile "
strSQL = strSQL & "GROUP BY Profile_Location
"
strSQL = strSQL & "HAVING SUM(Profile_Age)
> 35 "
|
|
จากคำสั่งด้านบนเป็นการเลือกค่าฟิลด์ Profile_Location, Profile_Age
ในตาราง Profile โดยเปลี่ยนชื่อฟิลด์ Profile_Age
เป็น ผลรวมของอายุ ซึ่งการแสดงผละเป็นการรวมค่าอายุของฟิลด์
Profile_Location ที่มีค่าเหมือนกันโดยที่จะต้องมีผลรวมที่มากกว่า
35 ซึ่งจะได้ผลดังนี้
Profile_Location |
ผลรวมของอายุ |
|
Hongkong |
158 |
Jagata |
52 |
|
|
ซึ่งจะมีเพียง 2 ค่าเท่านั้นที่แสดงออกมาเพราะมากกว่า 35