โจทย์
Query ตาราง TRANSACTIONS: นับจำนวน ORDER_ID ต่อ TRANSACTION_ID
คำตอบ
SELECT TRANSACTION_ID, COUNT(ORDER_ID) FROM TRANSACTIONS GROUP BY TRANSACTION_ID;
ข้อมูลตัวอย่าง: TRANSACTIONS Table
| TRANSACTION_ID | ORDER_ID |
|---|---|
| IRN22345 | A23118 |
| IRN22345 | A45901 |
| IRN22345 | A67990 |
| IRN56902 | A23119 |
| IRN99781 | A67921 |
| IRN56902 | A23167 |
ผลลัพธ์ Query
| TRANSACTION_ID | COUNT(ORDER_ID) |
|---|---|
| IRN22345 | 3 |
| IRN56902 | 2 |
| IRN99781 | 1 |
คำอธิบาย
GROUP BY TRANSACTION_ID: จัดกลุ่มแถวที่มี TRANSACTION_ID เหมือนกันCOUNT(ORDER_ID): นับจำนวน ORDER_ID ในแต่ละกลุ่ม (ไม่นับ NULL)- ผลลัพธ์: 1 แถวต่อ 1 TRANSACTION_ID
ขยาย: เพิ่มเงื่อนไข HAVING
SELECT TRANSACTION_ID, COUNT(ORDER_ID) AS order_count FROM TRANSACTIONS GROUP BY TRANSACTION_ID HAVING COUNT(ORDER_ID) > 1;
แสดงเฉพาะ Transaction ที่มี Order มากกว่า 1
ฟังก์ชัน Aggregate อื่นๆ
| ฟังก์ชัน | คำอธิบาย |
|---|---|
| COUNT(*) | นับจำนวนแถว (รวม NULL) |
| COUNT(col) | นับค่า Non-NULL ของคอลัมน์ |
| SUM(col) | ผลรวม |
| AVG(col) | ค่าเฉลี่ย |
| MIN/MAX(col) | ค่าต่ำสุด/สูงสุด |
| STDDEV(col) | Standard Deviation |
Best Practices
- SELECT เฉพาะคอลัมน์ใน GROUP BY หรือ Aggregate Function
- ใช้ Alias (
AS order_count) เพื่ออ่านง่าย - WHERE กรองก่อน GROUP BY, HAVING กรองหลัง GROUP BY
- Index บน GROUP BY Column ช่วยประสิทธิภาพ
MySQL vs DB2
Syntax นี้ใช้ได้ใน MySQL, PostgreSQL, Oracle, SQL Server, DB2 เหมือนกัน (Standard SQL)