Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

MySQL: GROUP BY, HAVING, ORDER BY แสดงผลรวมในช่วงที่กำหนด


คำอธิบาย

รวม GROUP BY จัดกลุ่ม, HAVING กรองกลุ่ม, ORDER BY เรียงลำดับ ในคิวรี่เดียว เพื่อหาลูกค้าที่ยอดซื้อรวมอยู่ในช่วง 1600-2000

ขั้นตอนการสร้างตารางและข้อมูลตัวอย่าง

mysql> create table DemoTable ( 
    Id int NOT NULL AUTO_INCREMENT PRIMARY KEY, 
    CustomerName varchar(20), 
    ProductPrice int ); 
Query OK, 0 rows affected (0.70 sec)

การเพิ่มข้อมูล

mysql> insert into DemoTable(CustomerName, ProductPrice) values('Chris', 600); 
Query OK, 1 row affected (0.18 sec)
mysql> insert into DemoTable(CustomerName, ProductPrice) values('David', 450); 
Query OK, 1 row affected (0.09 sec)
mysql> insert into DemoTable(CustomerName, ProductPrice) values('Chris', 980); 
Query OK, 1 row affected (0.40 sec)
mysql> insert into DemoTable(CustomerName, ProductPrice) values('Mike', 1200); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(CustomerName, ProductPrice) values('Chris', 400); 
Query OK, 1 row affected (0.11 sec)
mysql> insert into DemoTable(CustomerName, ProductPrice) values('David', 1200); 
Query OK, 1 row affected (0.20 sec)

แสดงข้อมูลทั้งหมด

mysql> select * from DemoTable;

ผลลัพธ์:

+----+--------------+--------------+
| Id | CustomerName | ProductPrice |
+----+--------------+--------------+
| 1  | Chris        | 600          |
| 2  | David        | 450          |
| 3  | Chris        | 980          |
| 4  | Mike         | 1200         |
| 5  | Chris        | 400          |
| 6  | David        | 1200         |
+----+--------------+--------------+
6 rows in set (0.00 sec)

คิวรี่รวม GROUP BY, HAVING, ORDER BY

mysql> select CustomerName, sum(ProductPrice) AS Total_Price 
from DemoTable 
group by CustomerName 
having sum(ProductPrice) between 1600 and 2000 
order by CustomerName DESC;

ผลลัพธ์

+--------------+-------------+
| CustomerName | Total_Price |
+--------------+-------------+
| David        | 1650        |
| Chris        | 1980        |
+--------------+-------------+
2 rows in set (0.00 sec)

คำอธิบายขั้นตอน

  1. GROUP BY CustomerName: จัดกลุ่ม Chris (600+980+400=1980), David (450+1200=1650), Mike (1200)
  2. HAVING SUM BETWEEN 1600 AND 2000: กรองกลุ่มที่ยอดรวมอยู่ในช่วง (Mike 1200 ถูกตัดออก)
  3. ORDER BY CustomerName DESC: เรียงชื่อ Z-A (David ก่อน Chris)

ความแตกต่าง WHERE vs HAVING

  • WHERE: กรองแถว ก่อน จัดกลุ่ม (ไม่ใช้ Aggregate function ได้)
  • HAVING: กรองกลุ่ม หลัง จัดกลุ่ม (ใช้ Aggregate function ได้)