วลี GROUP BY SQL
- หน้าก่อน SQL sum()
- หน้าต่อไป SQL Having
ฟังก์ชันหารวม (เช่น SUM) มักจะต้องใช้คำสั่ง GROUP BY
คำสั่ง GROUP BY
คำสั่ง GROUP BY ใช้เข้ารวมฟังก์ชันหารวม,เพื่อจัดกลุ่มตัวแทนตามคอลัมน์หนึ่งหรือหลายคอลัมน์ของผลลัพธ์
ระบบแสดงความเห็น SQL GROUP BY
SELECT column_name, aggregate_function(column_name) FROM table_name WHERE column_name operator value GROUP BY column_name
ตัวอย่าง SQL GROUP BY
เรามีตาราง "Orders" ดังนี้:
O_Id | OrderDate | OrderPrice | Customer |
---|---|---|---|
1 | 2008/12/29 | 1000 | Bush |
2 | 2008/11/23 | 1600 | Carter |
3 | 2008/10/05 | 700 | Bush |
4 | 2008/09/28 | 300 | Bush |
5 | 2008/08/06 | 2000 | Adams |
6 | 2008/07/21 | 100 | Carter |
ตอนนี้ เราต้องการหาจำนวนเงินรวม (จำนวนรายการสั่งซื้อ) ของลูกค้าแต่ละคน
เราต้องการใช้ GROUP BY สำหรับการทำกลุ่มลูกค้า
เราใช้คำสั่ง SQL ดังนี้:
SELECT Customer,SUM(OrderPrice) FROM Orders GROUP BY Customer
ผลลัพธ์ของ GROUP BY ที่เราต้องการคล้ายกัน:
Customer | SUM(OrderPrice) |
---|---|
Bush | 2000 |
Carter | 1700 |
Adams | 2000 |
เกินความคาดหวังนัก บ้างไม่?
ให้เรามองเห็นสถานการณ์ที่มี GROUP BY ละครระหว่าง
SELECT Customer,SUM(OrderPrice) FROM Orders
ผลลัพธ์ของ GROUP BY ที่เราต้องการคล้ายกัน:
Customer | SUM(OrderPrice) |
---|---|
Bush | 5700 |
Carter | 5700 |
Bush | 5700 |
Bush | 5700 |
Adams | 5700 |
Carter | 5700 |
ผลลัพธ์ของ GROUP BY ที่เราต้องการไม่ได้
ทำไมไม่สามารถใช้คำสั่ง SELECT ดังกล่าวได้? ชี้แจงด้านล่าง: คำสั่ง SELECT ดังกล่าวกำหนดลูกชื่อสองลูก (Customer และ SUM(OrderPrice))。"SUM(OrderPrice)" กลับมาด้วยค่าเดียว (รวมทั้งหมดของลูกชื่อ "OrderPrice") และ "Customer" กลับมาด้วย 6 ค่า (แต่ละค่าตอบคำถามตามแถวในตาราง "Orders") ดังนั้น เราไม่ได้รับผลลัพธ์ที่ถูกต้อง แต่คุณได้เห็นแล้ว GROUP BY ได้แก้ปัญหานี้
GROUP BY ลูกชื่อมากกว่าหนึ่งลูกชื่อ
เราก็สามารถใช้ GROUP BY สำหรับลูกชื่อเพื่อเลือกมากกว่าหนึ่งลูกชื่อ ตัวอย่างเช่น:
SELECT Customer,OrderDate,SUM(OrderPrice) FROM Orders GROUP BY Customer,OrderDate
- หน้าก่อน SQL sum()
- หน้าต่อไป SQL Having