ข้อควรทราบเมื่อต้องใช้
GROUP BY and HAVING
1. ถ้าในคำสั่งมีการเลือกคอลัมน์ที่ถูกคำนวณด้วย
aggregate function และคอลัมที่ไม่ได้ถูกคำนวณด้วย aggregate
function อยู่ด้วยกันคุณต้องใช้วลี
GROUP
BY ร่วมด้วยมิเช่นนั้นจะเกิดข้อผิดพลาด
เนื่องจากค่าที่ถูกคำนวณด้วย aggregate function จะคืนค่ามาเพียงค่าเดียว
ส่งนคอลัมน์ที่ไม่ได้ถูกคำนวณจะคืนค่าออกมาหลายๆ Record ทำให้จำนวน Record
ของทั้ง 2 คอลัมน์ไม่เท่ากัน จึงไม่สามารถแสดงผลลอกมาให้เราดูได้ เช่น
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile
" |
|
ถ้าใช้คำสั่งเพียงแค่นี้จะผิดทันที
อย่างที่ถูกคือ
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL & "GROUP
BY Profile_Location" |
|
2. ต่อเนื่องมาจากข้อที่ 1 ถ้าได้มีการใช้วลี
GROUP BY แล้ว คอลัมน์ที่ตามหลังวลี GROUP
BY จะต้องเลือกคอลลัมน์ทั้งหมด
ทั้งที่ถูกคำนวณและไม่ถูกคำนวณจะเลือกเพียงคอลัมน์ใดคอลัมน์หนึ่งไม่ได้
ซึ่งเหตุผลก็เหมือนกับข้อแรกคือจำนวน Record จะไม่เท่ากัน ดังนี้
strSQL = "SELECT Profile_ID,Profile_Location, SUM(Profile_Age)
As ผลรวมของอายุ "
strSQL = strSQL & "FROM
Profile "
strSQL = strSQL & "GROUP
BY Profile_Location"
|
|
ถ้าใช้คำสั่งเพียงแค่นี้จะผิดทันที
อย่างที่ถูกคือ
strSQL = "SELECT Profile_ID,Profile_Location, SUM(Profile_Age)
As ผลรวมของอายุ "
strSQL = strSQL & "FROM
Profile "
strSQL = strSQL &
"GROUP BY Profile_ID,Profile_Location" |
|
3. คอลัมน์ที่ตามหลังวลี
GROUP BY ซึ่งเลือกขึ้นมา
เพื่อจัดกลุ่มไม่จำเป็นต้องอยู่ในวลี SELECT แต่ต้องเป็นคอลัมน์ที่มีอยู่ในตารางที่กำหนดในวลี
FROM ดังนี้
strSQL = "SELECT SUM(Profile_Age) As ผลรวมของอายุ"
strSQL = strSQL & "FROM
Profile "
strSQL = strSQL & "GROUP BY Profile_ID >= 5 AND
Profile_ID <= 8
" |
|
4. วลี HAVING กับ WHERE มีข้อแตกต่างกันตรงลำดับการตรวจสอบของเงื่อนไข
โดยวลี WHERE จะเลือก Record ที่ตรงตามเงื่อไขไว้ก่อนที่คอลัมน์นั้นจะถูกคำนวณโดย
aggregate function ดังนั้นเงื่อนไขในวลี
WHERE จะใช้ผลลัพธ์ที่ถูกคำนวณจาก
aggregate function มาในการกำหนดเงื่อนไขไม่ได้
แต่ทว่าวลี HAVING นั้นจะเลือก
Record ที่ตรงตามเงื่อนไขหลังจากที่คอลัมน์นั้นถูกคำนวณด้วย aggregate
function แล้วดังนี้
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL &
"WHERE SUM(Profile_Age) > 30
strSQL = strSQL &
"GROUP BY Profile_Location "
strSQL = strSQL & "HAVING Profile_Age > 35
"
|
|
ถ้าใช้คำสั่งเพียงแค่นี้จะผิดทันที อย่างที่ถูกคือ
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL &
"WHERE Profile_Age > 30
strSQL = strSQL &
"GROUP BY Profile_Location "
strSQL = strSQL & "HAVING SUM(Profile_Age) >
35 " |
|
5. ในกรณีที่ต้องการให้คอลัมน์ที่ไม่ตรงตามเงื่อนไขในวลี
WHERE ถูกแสงดค่าออกมาเป็น NULL ด้วยหลังจากจัดกลุ่มแล้ว ให้ใส้คีเวิร์ด
ALL ตามหลังวลี GROUP
BY ดังนี้
strSQL = "SELECT Profile_Location, SUM(Profile_Age) As ผลรวมของอายุ
"
strSQL = strSQL & "FROM Profile "
strSQL = strSQL & "WHERE Profile_Age
> 30
strSQL = strSQL & "GROUP BY ALL Profile_Location
" |
|
6. ในการเขียนคำสั่งแล้วรันผลด้วย ASP จะต้องมีการเปลี่ยนชื่อของคอลัมน์เสมอไม่เช่นนั้นจะไม่สามารถแสดงผลลอกมาได้
ซึ่งต่างกับการใช้ โปรแกรม MS SQL SERVER
ที่ไม่ต้องตั้งชื่อใหม่ก็ได้เพราะจะขึ้นให้ในตาราง VIEW ว่า (No column name)
strSQL = "SELECT SUM(Profile_Age) As ผลรวมของอายุ "
strSQL = strSQL & "FROM Profile
"
strSQL = strSQL & "WHERE Profile_ID >= 5 AND Profile_ID <= 8
" |
|
|
ช่วยกันสนับสนุนรักษาเว็บไซต์ความรู้แห่งนี้ไว้ด้วยการสนับสนุน Source Code 2.0 ของทีมงานไทยครีเอท
|
|
|
By : |
ThaiCreate.Com Team (บทความเป็นลิขสิทธิ์ของเว็บไทยครีเอทห้ามนำเผยแพร่ ณ เว็บไซต์อื่น ๆ) |
|
Score Rating : |
|
|
|
Create/Update Date : |
2008-08-10 16:04:03 /
2012-05-30 21:09:44 |
|
Download : |
No files |
|
Sponsored Links / Related |
|
|
|
|
|
|
|