Giới thiệu

Chúng ta sẽ thực hành viết các query tính tích, tổng giá trị đơn hàng trong database Northwind.

Ở đây các tables hơi khó hiểu vì không giản lược như trong nhiều bài hướng dẫn khác trên web. Tuy nhiên, những ví dụ nay gần giống với các tình huống phức tạp trong thực tế, giúp chúng ta rèn luyện kĩ năng coding tốt hơn.

Ba tables liên quan là Customers, Orders, Order Details sẽ được sử dụng như dưới đây:

Liên kết 3 tables với nhau qua các cột CustomerID và OrderID như trên

1. Viết một query để tính tổng số tiền đã đặt hàng theo sản phẩm

Tích của đơn giá UnitPrice và số lượng Quantity, trừ đi số Discount sẽ bằng số tiền của đơn hàng:

2. Viết một query để tính tổng số tiền đã đặt hàng theo đơn hàng

Vì mỗi đơn hàng (OrderID) có nhiều sản phẩm khác nhau, vì thế khi tính giá trị đơn hàng chúng ta phải tính tổng giá trị của các sản phẩm trong đơn hàng đó.

Dữ liệu liên quan đến hai tables Orders và Order Details. Ở đây dữ liệu từ hai tables Orders và Order Details đã được kết nối với nhau qua OrderID và cách tính như sau:

3. Viết một query để tính tổng giá trị đơn hàng đã đặt hàng theo khách hàng

Trong tình huống này chúng ta phải sử dụng dữ liệu từ ba tables liên quan là Customers, Orders và Order Details. Mối liên quan là CustomerID, OrderID như sau:

Trường hợp thứ 3 này phức tạp nhất vì phải lấy dữ liệu từ ba tables khác nhau, có liên quan (relational tables).

Bây giờ chúng ta làm việc với những query có thêm nhiều điều kiện khác như sau:

4. Viết một query để tìm ra những khách hàng có tổng giá trị đơn hàng nhiều hơn 25,000

5. Viết một query để tìm ra những khách hàng có tổng giá trị đơn hàng cao nhất trong mỗi country

Chúng ta tìm ra được những khách hàng có giá trị đơn đặt hàng cao nhất trong quốc gia của họ. Dưới đây là TOP 15 khách hàng cao nhất đó.

‘INTO Tab_Max’ là đoạn code để tạo ra một bảng mới có tên là Tab_Max, từ đây nó được sử dụng cho đoạn code tìm ra những khách hàng có giá trị đơn hàng cao nhất trong mỗi quốc gia.

Nếu muốn coding theo những subquery thì chúng ta không cần tạo ra table mới mang tên Tab_Max, thay vào đó viết trực tiếp như sau:

Kết quả vẫn đồng nhất với phương pháp đã nói ở trên.

6. Viết một query để tính tổng giá trị của những đơn hàng theo khách hàng đã đặt hàng trong hai năm 1997 và 1998

Chúng ta đưa YEAR(OrderDate) vào trong Mệnh đề WHERE làm điều kiện để lọc dữ liệu.

7. Viết một query để tính số khách hàng, số đơn hàng và tổng giá trị đơn hàng theo country

Chúng ta dùng hàm COUNT() trong trường hợp này. Khai báo DISTINCT để chỉ đếm mỗi CustomerID một lần duy nhất.

8. Viết một query để phân loại khách hàng. Khi một khách hàng có tổng giá trị đơn hàng lớn hơn hoặc bằng trung bình chung của những đơn hàng thì được xếp vào loại ‘HIGH’. Khi tổng giá trị đơn hàng thấp hơn trung bình thì xếp loại ‘LOW’.

Hàm trung bình AVG() sẽ được sử dụng trong trường hợp này. Ngoài ra chúng ta viết ‘CASE, WHEN, THEN, ELSE, END AS’ để khai báo như sau:

Để làm gọn gàng những con số thập phân (decimal) của Amount_Cust, chúng ta dùng hàm ROUND() như sau:

9. Viết một query để tìm ra những khách hàng có tổng giá trị hóa đơn cao hơn trung bình tổng giá trị hóa đơn trong country của họ

Chúng ta dùng hàm trung bình AVG() để tính như sau:

10. Viết một query để tìm ra những khách hàng có số đơn hàng >= 10 trong khoảng thời gian năm 1997-1998

Chúng ta dùng hàm COUNT(o.OrderID) và YEAR(o.OrderDate) như sau