2017-11-29 33 views
8

Cảm ơn bạn đã dành thời gian đọc và trả lời câu hỏi của tôi.Sắp xếp theo số theo SQL và được nhóm lại

Tôi đã là một vấn đề nhỏ phân loại tôi chỉ cho bạn:

truy vấn SQL của tôi là:

SELECT p.advisor_create, COUNT(p.id) AS Nb, IF(p.cancel_advisor IS 
NULL, "no", "yes") AS refund 
FROM payment p 
WHERE p.type = 'CESSATION' 
AND p.date BETWEEN '2017-01-01 00:00:00' AND '2017-11-31 23:59:59' 
GROUP BY p.advisor_create, refund 
ORDER BY p.advisor_create, Nb DESC 

Các dữ liệu tôi nhận được từ này là như thế:

+-------+---+------+ 
|advisor| NB|refund| 
+-------+---+------+ 
| 170432| 50| no| 
| 170432| 4| yes| 
| 175222| 30| no| 
| 175222| 3| yes| 
| 182985|304| no| 
| 182985| 19| yes| 
| 362912|360| no| 
| 362912| 13| yes| 
+-------+---+------+ 

Và tôi sẽ sắp xếp như sau:

+-------+---+------+ 
|advisor| NB|refund| 
+-------+---+------+ 
| 362912|360| no| 
| 362912| 13| yes| 
| 182985|304| no| 
| 182985| 19| yes| 
| 170432| 50| no| 
| 170432| 4| yes| 
| 175222| 30| no| 
| 175222| 3| yes| 
+-------+---+------+ 

Sắp xếp theo MAX (NB) của cùng một "cố vấn" và nhóm hai dòng của một cố vấn lại với nhau.

Cảm ơn bạn một lần nữa vì sự giúp đỡ của bạn.

Giải pháp: Thank để @ gordon-linoff cho điều này

SELECT p.advisor_create, COUNT(p.id) AS Nb, 
    IF(p.cancel_advisor IS NULL, 'no', 'yes') AS refund 
FROM payment p 
WHERE p.type = 'CESSATION' AND 
    p.date >= '2017-01-01' AND 
    p.date < '2017-12-01' 
GROUP BY p.advisor_create, refund 
ORDER BY (SELECT COUNT(*) 
     FROM payment p2 
     WHERE p2.advisor_create = p.advisor_create AND 
      p2.type = 'CESSATION' AND 
      p2.date >= '2017-01-01' AND 
      p2.date < '2017-12-01' AND 
      p2.cancel_advisor IS NULL 
    ) DESC, 
    p.advisor_create, Nb DESC 

Trả lời

2

Bạn có thể sử dụng một subquery trong order by. Điều này cho phép bạn làm:

SELECT p.advisor_create, COUNT(p.id) AS Nb, 
     IF(p.cancel_advisor IS NULL, 'no', 'yes') AS refund 
FROM payment p 
WHERE p.type = 'CESSATION' AND 
     p.date >= '2017-01-01' AND 
     p.date < '2017-12-01' 
GROUP BY p.advisor_create, refund 
ORDER BY (SELECT COUNT(*) 
      FROM payment p2 
      WHERE p2.advisor_create = p.advisor_create AND 
       p2.type = 'CESSATION' AND 
       p2.date >= '2017-01-01' AND 
       p2.date < '2017-12-01' AND 
       p2.cancel_advisor IS NULL 
     ), 
     p.advisor_create, Nb DESC; 

Giả định bạn muốn sắp xếp theo giá trị "không". Nếu bạn muốn sắp xếp theo tổng số, chỉ cần loại bỏ điều kiện đó khỏi truy vấn phụ.

Cũng lưu ý rằng tôi đã đơn giản hóa các so sánh ngày tháng. Không có lý do để đi đến giây - trên thực tế, between không được khuyến nghị cho so sánh ngày/giờ, vì sự nhầm lẫn phát sinh với thành phần thời gian.

+0

Cảm ơn câu trả lời của bạn. Đó là những gì tôi muốn. –

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