2013-04-04 43 views
28

Tôi có bảng db sau đây và tôi muốn có thể đếm được trường hợp bán các sản phẩm nhất định trên mỗi nhân viên bán hàng.Các cột đếm MySQL về giá trị cụ thể

|------------|------------|------------| 
|id   |user_id  |product_id | 
|------------|------------|------------| 
|1   |1   |2   | 
|2   |1   |4   | 
|3   |1   |2   | 
|4   |2   |1   | 
|------------|------------|------------| 

Tôi muốn tạo tập hợp kết quả như sau;

|------------|-------------|------------|------------|------------| 
|user_id  |prod_1_count |prod_2_count|prod_3_count|prod_4_count| 
|------------|-------------|------------|------------|------------| 
|1   |0   |2   |0   |1   | 
|2   |1   |0   |0   |0   | 
|------------|-------------|------------|------------|------------| 

Tôi đang tạo biểu đồ với dữ liệu này và một lần nữa (như trước đó hôm nay) Tôi không thể đếm tổng số cột. Tôi đã thử;

SELECT user_id, 
(SELECT count(product_id) FROM sales WHERE product_id = 1) AS prod_1_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 2) AS prod_2_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 3) AS prod_3_count, 
(SELECT count(product_id) FROM sales WHERE product_id = 4) AS prod_4_count 
FROM sales GROUP BY user_id; 

Tôi có thể thấy lý do tại sao điều này không hiệu quả, vì đối với mỗi SELECT được chọn, user_id không khớp với user_id bên ngoài trong câu lệnh SELECT chính.

Có ai có thể giúp tôi ở đây không?

nhờ bạn

Trả lời

62

Bạn có thể làm điều này bằng SUMCASE:

select user_id, 
    sum(case when product_id = 1 then 1 else 0 end) as prod_1_count, 
    sum(case when product_id = 2 then 1 else 0 end) as prod_2_count, 
    sum(case when product_id = 3 then 1 else 0 end) as prod_3_count, 
    sum(case when product_id = 4 then 1 else 0 end) as prod_4_count 
from your_table 
group by user_id 
+0

Cảm ơn Ike, đây là giải pháp nhanh nhất trong số tất cả các giải pháp. Cảm ơn bạn :) –

+2

Bạn không thể làm 'sum (product_id = 1)'? 'product_id = 1' là một biểu thức boolean; nó sẽ tự nhiên trả về 1 hoặc 0 mà không có trường hợp chuyển đổi. – mpen

+1

@Mark yes có thể hoạt động tốt và có thể nhanh hơn, nhưng tôi thấy giải pháp được viết để dễ đọc hơn. –

1

Xem nếu công trình này:

SELECT a.user_id, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 1 AND a.user_id = b.user_id) AS prod_1_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 2 AND a.user_id = b.user_id) AS prod_2_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 3 AND a.user_id = b.user_id) AS prod_3_count, 
(SELECT count(b.product_id) FROM sales b WHERE b.product_id = 4 AND a.user_id = b.user_id) AS prod_4_count 
FROM sales a GROUP BY a.user_id; 

Cheers. n.b. có thể có những cách hơi đẹp hơn để đạt được kết quả tương đương.

+2

nhờ, giải pháp này đã làm việc, nhưng phải mất một vài giây. Giải pháp của Ike rất nhanh khi so sánh, nhưng cảm ơn bạn đã trả lời câu hỏi của bạn @ d'alar'cop –

14

Bạn đang cố gắng trục dữ liệu. MySQL không có một chức năng trục, do đó bạn sẽ phải sử dụng một chức năng tổng hợp với một biểu thức CASE:

select user_id, 
    count(case when product_id = 1 then product_id end) as prod_1_count, 
    count(case when product_id = 2 then product_id end) as prod_2_count, 
    count(case when product_id = 3 then product_id end) as prod_3_count, 
    count(case when product_id = 4 then product_id end) as prod_4_count 
from sales 
group by user_id; 

Xem SQL Fiddle with Demo

+1

Tôi ước tôi có thể đưa ra 1.000 mũi tên này. Xoay vòng chỉ cần nhấp. – ghukill

Các vấn đề liên quan