Joins with grouping · Join với nhóm
Reports: joins with grouping
The real power comes from combining what you have learned: join two tables, group the joined rows, and summarise each group with an aggregate.
A common report is "how much has each customer spent?" — join customers to their orders, group by customer, and SUM the totals.
Báo cáo: ghép nối với nhóm
Sức mạnh thực sự đến từ việc kết hợp những gì bạn đã học: ghép nối hai bảng, nhóm các hàng đã ghép, và tóm tắt từng nhóm bằng hàm tổng hợp.
Một báo cáo phổ biến là "mỗi khách hàng đã chi bao nhiêu?" — ghép nối khách hàng với đơn hàng của họ, nhóm theo khách hàng, và SUM tổng số tiền.
One row per customer
Reading it in order: join the tables, group the rows by customer, then for each group count the orders and add up the totals.
Một hàng cho mỗi khách hàng
SELECT customer.name,
COUNT(*) AS orders,
ROUND(SUM(orders.total), 2) AS spent
FROM customer
INNER JOIN orders ON customer.id = orders.customer_id
GROUP BY customer.id
ORDER BY customer.name;
Đọc theo thứ tự: ghép nối các bảng, nhóm các hàng theo khách hàng, sau đó đối với mỗi nhóm đếm số đơn hàng và cộng tổng số tiền.
Common mistakes
- Join first, then
GROUP BYto summarise the joined rows. - Qualify a column with its table name when both tables share it.
Những lỗi thường gặp
- Ghép nối trước, sau đó
GROUP BYđể tóm tắt các hàng đã ghép. - Ghi rõ tên bảng đi kèm cột khi cả hai bảng đều chứa cùng tên cột.
Joining tables · Ghép nối bảng
An inner join drops rows that have no match. · Inner join loại bỏ các hàng không có sự khớp nào.
For each customer who has orders, show their name, their number of orders as orders, and their total spend (2 d.p.) as spent. Join, group by customer.id, and order by name. · Đối với mỗi khách hàng có đơn hàng, hiển thị name của họ, số lượng đơn hàng là orders, và tổng chi tiêu (2 chữ số thập phân) là spent. Join, nhóm theo customer.id, và sắp xếp theo name.
Click Run to see the output here. · Nhấn Chạy để xem kết quả ở đây.
An INNER JOIN hid Ben and Dan, who have no orders. Use a LEFT JOIN to keep every customer, and COUNT(orders.id) so a customer with no orders shows 0. Order by name. · Một INNER JOIN đã ẩn Ben và Dan, những người không có đơn hàng. Sử dụng LEFT JOIN để giữ mọi khách hàng, và COUNT(orders.id) sao cho khách hàng không có đơn hàng sẽ hiển thị 0. Sắp xếp theo name.
Click Run to see the output here. · Nhấn Chạy để xem kết quả ở đây.