Đây không phải là câu trả lời đầy đủ nhưng nó gần đúng. Mặc dù vậy, cho dù tôi xử lý dữ liệu như thế nào, tôi không thể tìm ra cách bạn sử dụng cash_has
. Ngoài ra, tôi đang giữ nó là SQL thô vì tôi cảm thấy nó sẽ hữu ích hơn và không khó để chuyển đổi trở lại trình tạo truy vấn. Tôi cũng không biết tên cột chính xác nên bạn có thể phải sửa một số trong số đó.
SELECT
COALESCE(outlets_admin.name, outlets.name) AS outlet,
COALESCE(boys_admin.name, boys.name) AS delivery_boy,
SUM(IF(cm.source_type = 'admin', amount, 0)) AS cash_taken,
SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_returned,
SUM(IF(cm.source_type = 'admin', amount, 0)) - SUM(IF(cm.source_type = 'deliveryBoy', amount, 0)) AS cash_has
FROM delivery_cash_manages cm
LEFT JOIN outlets ON outlets.id = cm.destination_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN delivery_boys boys ON boys.id = cm.source_id AND cm.source_type = 'deliveryBoy'
LEFT JOIN outlets outlets_admin ON outlets_admin.id = cm.source_id AND cm.source_type = 'admin'
LEFT JOIN delivery_boys boys_admin ON boys_admin.id = cm.destination_id AND cm.source_type = 'admin'
WHERE COALESCE(outlets.id, outlets_admin.id) = '2' # This is where you plug in your $outlet_id
GROUP BY outlet, delivery_boy
Tuy nhiên, lý do bạn gặp lỗi với truy vấn của mình là nếu bạn nhóm theo bất kỳ thứ gì, bạn cần phải nhóm theo mọi thứ bạn chọn mà không phải là các cột tổng hợp (các hàm như sum, max, avg).