Nó có thể là một khó khăn để tính toán phần trăm trong MySQL. Chưa có chức năng nào cho nó. Phần trăm hữu ích để xếp hạng và nhóm người dùng hoặc khách hàng.
Bạn có thể xác định người dùng hoặc khách hàng có giá trị nhất của mình và tạo ưu đãi đặc biệt cho họ. Đây là một truy vấn được tạo sẵn để thực hiện.
Ví dụ:Bạn có một bảng đơn đặt hàng trong đó chứa tất cả các đơn đặt hàng sản phẩm cho mỗi người dùng. Bạn muốn tính toán phần trăm.
order +-----------+------------+----------+ | user_id | product | sales | +-----------+------------+----------+ | 1 | Soap | 10 | | 4 | Perfume | 100 | | 1 | Noodles | 20 | | 3 | Deo | 200 | +-----------+------------+----------+
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 33.33 | | 4 | 100 | 2 | 66.67 | | 3 | 200 | 1 | 100 | +-----------+----------+---------+---------------+
Đây là một truy vấn bạn có thể sử dụng để tính toán phần trăm trong MySQL dựa trên tổng số. Chỉ cần thay thế các cột - user_id, sales và table - order. Nó tổng hợp tổng doanh số cho mỗi người dùng. Sau đó, nó xếp hạng chúng trên tổng doanh số bán hàng. Cuối cùng, nó tính toán phần trăm bằng cách sử dụng xếp hạng.
select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM (select user_id,sum(sales) as total from `order` group by user_id) p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
Nếu bạn đã có tổng doanh số bán hàng cho mỗi người dùng trong bảng và muốn trực tiếp sử dụng bảng để tính phần trăm, đây là một truy vấn
select user_id,total,rank,round(100*(cnt-rank+1)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM `order` p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
order +-----------+----------+ | user_id | total | +-----------+----------+ | 1 | 30 | | 4 | 100 | | 3 | 200 | +-----------+----------+
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 33.33 | | 4 | 100 | 2 | 66.67 | | 3 | 200 | 1 | 100 | +-----------+----------+---------+---------------+
Như bạn có thể thấy, người dùng được xếp hạng cuối cùng không có phân vị bằng không. Đây là bản chất của tính toán phần trăm. Người đầu tiên có thể có 100 phần trăm hoặc người xếp hạng cuối cùng có thể có số không. Cả hai không thể xảy ra cùng một lúc. Nếu bạn muốn buộc người được xếp hạng cuối cùng có phân vị bằng 0, bạn có thể sử dụng các truy vấn sau. Tôi không thêm 1 vào thứ hạng trong khi tính toán phần trăm.
select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM (select user_id,sum(sales) as total from `order` group by user_id) p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
Nếu bạn đã có tổng doanh số bán hàng cho mỗi người dùng trong bảng và muốn trực tiếp sử dụng bảng để tính phần trăm, đây là một truy vấn
select user_id,total,rank,round(100*(cnt-rank)/cnt,0) as percentile from (SELECT user_id,total,@curRank := @curRank + 1 AS rank FROM `order` p, (SELECT @curRank := 0) r ORDER BY total desc ) as dt,(select count(distinct user_id) as cnt from `order`) as ct
percentiles +-----------+----------+---------+---------------+ | user_id | total | rank | percentile | +-----------+----------+---------+---------------+ | 1 | 30 | 3 | 0 | | 4 | 100 | 2 | 33.33 | | 3 | 200 | 1 | 66.67 | +-----------+----------+---------+---------------+
SQL để tạo thứ tự bảng mẫu: