2011-07-12 6 views
1

J'écris des requêtes raisonnablement complexes pour la création de rapports pour une application que je développe. Je pourrais probablement réaliser tout ce qui suit en utilisant PHP de niveau supérieur, mais évidemment, je voudrais tout faire avec MySQL qui va évidemment simplifier les choses grandement. Le rapport dont j'ai besoin est une requête typique de type de rapport de vente, qui liste une liste de personnes, et quelques totaux pertinents les concernant. La seule différence mineure est que ce système concerne le fret/transport, de sorte que les «vendeurs» sont en fait des chauffeurs de camion, et les «ventes» sont des envois individuels. En outre, les envois ne sont liés/liés à leur conducteur respectif qu'à travers la création de «routes», qui enregistrent qui livre/recueille quoi un jour spécifique.Répétition de sous-requête MySQL avancée

Naturellement, je pourrais utiliser un INNER JOIN pour obtenir une liste de chaque conducteur, avec tous les envois qu'ils ont livrés/collectés, et SUM les revenus tirés de ceux-ci. Le problème vient cependant, quand j'ai besoin de montrer à la fois une colonne pour revenus de livraison et revenu de la collection. Ces chiffres peuvent provenir d'un tableau consignations, qui répertorie chaque envoi. Chaque envoi peut avoir un drapeau (ENUM "D", "C") qui donne s'il s'agit d'une livraison ou d'une collecte. Cela peut être facilement vérifié en utilisant des sous-requêtes, mais il y aura beaucoup de répétitions.

Ce que j'ai jusqu'à présent:

SELECT pr.driver_callsign, d.first_name, d.last_name, sum(pc.revenue) AS total_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

Cela renvoie évidemment une liste de chaque pilote, le montant total des recettes à base de tous les envois qu'ils ont attachés à eux.

Quel serait le moyen le plus efficace de diviser davantage ce champ SUM revenue pour afficher un SUM(revenue) WHERE type = "C" et SUM(revenue) WHERE type="D"? Sous-requêtes? SYNDICAT?

Il peut également être utile de mentionner que la requête de fin sera réduite à une plage de dates. Donc, par exemple, il y aura un WHERE date BETWEEN x AND y mis contre la table pallet_routes.

Un conseil serait grandement apprécié. S'il vous plaît, demandez si vous voulez que j'explique davantage.

Répondre

1

Je ne sais pas où votre colonne type est, mais si elle est sur pallet_consignments, vous pouvez essayer ce qui suit:

SELECT pr.driver_callsign, d.first_name, d.last_name, 
SUM(IF(pc.`type` = 'C', pc.revenue, 0)) collection_revenue, 
SUM(IF(pc.`type` = 'D', pc.revenue, 0)) delivery_revenue 
FROM pallet_routes AS pr 
INNER JOIN drivers AS d ON d.driver_callsign = pr.driver_callsign 
INNER JOIN pallet_consignments AS pc ON pc.route_id = pr.route_id 
GROUP BY pr.driver_callsign 
ORDER BY d.driver_callsign ASC 

Sinon, s'il vous plaît mentionner où la colonne est type.

+0

Hey Shef merci pour votre temps. Quelque chose comme ça fonctionnerait en théorie, je suis d'accord, mais l'interpréteur MySQL ne l'aime pas et rapporte: 'Vous avez une erreur dans votre syntaxe SQL; consultez le manuel qui correspond à votre version du serveur MySQL pour la bonne syntaxe à utiliser près de 'SUM (IF (pc.'type' =' D ', pc.revenue, 0)) comme livraison_revenue FROM palette_routes' à la ligne 3' – George

+1

@George: J'ai oublié une virgule sur la somme précédente! Essayez la requête mise à jour. – Shef

+1

Shef, merci pour la réponse! La requête mise à jour fonctionne parfaitement, merci beaucoup! Je ne pensais même pas que je pourrais utiliser une telle FI pour atteindre ces résultats! – George