Mysql
 sql >> Base de données >  >> RDS >> Mysql

Requête éloquente de Laravel

Ce n'est pas la réponse complète, mais c'est proche. Peu importe comment je travaille les données, je n'arrive pas à comprendre comment vous arrivez avec cash_has . De plus, je le garde en SQL brut car je pense que ce serait plus utile et ne devrait pas être difficile à reconvertir en générateur de requêtes. Je ne connais pas non plus les noms exacts des colonnes, vous devrez peut-être en corriger certaines.

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

La raison pour laquelle vous obtenez une erreur avec votre requête est que si vous regroupez par quoi que ce soit, vous devez regrouper par tout ce que vous sélectionnez qui ne sont pas des colonnes agrégées (fonctions comme sum, max, avg).